system()产生不一致的结果

约翰·比尔(John Beale):

我正在使用awk将列添加到CSV文件。文件的每一行都以日期和时间开头。我希望新的专栏文章将那个时间作为Unix时代的时间戳记。

我正在将前三个字段填入“日期”,这确实给了我时间戳,但是有一些我不需要的逗号“”。下面是简化版本,仅打印一个时间戳列作为输出。输入文件:

08/17/2020 21:46:04 -700 , 1 , 2 , 3
08/17/2020 21:47:03 -700 , 1 , 2 , 3
08/17/2020 21:48:03 -700 , 1 , 2 
08/17/2020 21:49:04 -700 , 1 , 2 

这是我的程序:

cat input.csv | awk '{
       tmp=$(system("date +%s -d \""$1" "$2" "$3"\""));
       printf("%s", $tmp );
       }'

这是输出。这是我所期望的,除了第2行和第3行中的前导逗号。我认为'tmp'变量从'date'获取结果,包括尾随的换行符,但有时在换行符后还有逗号。这似乎取决于输入文件中前三个字段的数量,但是我仅引用前三个字段,因为$ 1 $ 2 $ 3所以其余的输入行不起作用(?)为什么这些逗号显示在输出,如何删除它们?有一个更好的方法吗?

1597725964
,1597726023
,1597726083
1597726144
约翰1024:

使用外壳

尝试:

$ while read -r line; do date +%s -d "${line%%,*}"; done < input.csv
1597725964
1597726023
1597726083
1597726144

这个怎么运作

  1. while read -r line; do启动while循环并从stdin读取一行。

  2. "${line%%,*}" 从该行中删除逗号及其后的所有内容。

  3. date +%s -d "${line%%,*}" 将日期打印为纪元。

  4. done完成while循环。

  5. <input.csv 提供标准输入到循环。

变异

这将打印整行并将纪元添加为最后一列:

$ while read line; do printf "%s, %s\n" "$line" $(date +%s -d "${line%%,*}"); done < input.csv
08/17/2020 21:46:04 -700 , 1 , 2 , 3, 1597725964
08/17/2020 21:47:03 -700 , 1 , 2 , 3, 1597726023
08/17/2020 21:48:03 -700 , 1 , 2, 1597726083
08/17/2020 21:49:04 -700 , 1 , 2, 1597726144

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章