将基于其他列的时间戳列添加到CSV中(使用bash)

时间:2018-08-28 15:47:05

标签: bash shell command-line

我需要像这样读取CSV文件( list.csv ):

[y_i]

并在第3、4和5列中添加基于年/月/日的Unix时间戳的列(无论放在哪里),都可以得到:

append_data += '<td><a href="#" class="delete-link" data-note-id="' + value.versionNote.idVersionNote + '"">Delete note</a></td>'

所以我写了这个 script.sh

$(document).on('click', '.delete-link', function() {
   var idVersionNote = this.attr("data-note-id"); 
   deleteVersionNote(idVersionNote);
});

然后我跑了

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

它可以正常工作,但是在包含非常大的CSV时非常慢。

有没有一种方法可以在sed / awk命令行中更快地完成它?

我的意思是,我可以(例如)将bash命令注入到sed / awk行中吗? 例如(我知道这行不通,只是一个例子):

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
...

2 个答案:

答案 0 :(得分:2)

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

不确定默认使用的小时/分钟/秒。

答案 1 :(得分:0)

对于其他没有内置时间功能的awks:

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