【问题标题】:Add to CSV a timestamp column based on other columns (using bash)将基于其他列的时间戳列添加到 CSV(使用 bash)
【发布时间】:2019-02-03 07:40:18
【问题描述】:

我需要像这样读取一个 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)}'

【问题讨论】:

  • 这个mktime 的回答应该会让你朝着正确的方向前进:Convert date to epoch time using AWK in linux
  • 您的输入中似乎有错字:2017:11;20
  • 谢谢!我修正了错字并尝试了您的提示。有用!它只有一个问题:它返回考虑到我的时区的年/月/日的时间戳。我想要一个UTC。但这是向前迈出的一步! :-)
  • 不...等等!这正是我想要的!谢谢!!!
  • 如果您想使用时区,请查看awk manual 中的utc-flag ;)

标签: bash shell command-line


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    对于其他没有内置时间函数的 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
    

    【讨论】:

      猜你喜欢
      • 2017-07-07
      • 2018-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-31
      • 1970-01-01
      • 2017-06-17
      相关资源
      最近更新 更多