簡體   English   中英

將基於其他列的時間戳列添加到CSV中(使用bash)

[英]Add to CSV a timestamp column based on other columns (using bash)

我需要像這樣讀取CSV文件( list.csv ):

0;John Doe;2001;03;24
1;Jane Doe;1985;12;05
2;Mr. White;2018;06;01
3;Jake White;2017;11;20
...

並根據第3、4和5列中的年/月/日添加帶有Unix時間戳的列(無論放在哪里),都可以得到:

0;John Doe;2001;03;24;985392000
1;Jane Doe;1985;12;05;502588800
2;Mr. White;2018;06;01;1527811200
3;Jake White;2017;11;20;1511136000
...

所以我寫了這個script.sh

#!/bin/sh

while read line
do
    printf "$line;"
    date -d $(awk -F\; '{print $3$4$5}' <<<$line) +%s
done

我跑了:

<list.csv ./script.sh

並且可以正常工作,但是在包含非常大的CSV時非常慢。

有沒有辦法在sed / awk命令行中更快地做到這一點?

我的意思是,我可以(例如)將bash命令注入sed / awk行嗎? 例如(我知道這行不通,只是一個例子):

awk -F\; '{print $1 ";" $2 ";" $3 ";" $4 ";" $5 ";" $(date -d $3$4$5 +%s)}'

GNU awk來解救!

$ gawk -F';' '{$0=$0 FS mktime($3" "$4" "$5" 00 00 00")}1' file

0;John Doe;2001;03;24;985410000
1;Jane Doe;1985;12;05;502606800
2;Mr. White;2018;06;01;1527825600
3;Jake White;2017;11;20;1511154000

不知道您默認使用什么小時/分鍾/秒。

對於其他沒有內置時間功能的awk:

awk -F';' '{
    cmd = "date -d "$3 $4 $5" +%s"
    cmd | getline time
    close(cmd)
    $0 = $0 FS time
    print
}' file

或perl

perl -MTime::Piece -F';' -lane '
    print join ";", @F, Time::Piece->strptime("@F[2..4]", "%Y %m %d")->epoch
' file

# or
perl -MTime::Local -F';' -lane '
    print join ";", @F, timelocal(0, 0, 0, $F[4], $F[3]-1, $F[2]-1900)
' file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM