【问题标题】:(g)awk: use GNU's date within system()(g)awk:在 system() 中使用 GNU 的日期
【发布时间】:2018-10-17 14:37:03
【问题描述】:

在一个 shell 脚本中,我想修改一个 CSV 文件(使用“|”作为字段分隔符),它有一列(八列),其中日期作为值。

更准确地说,我想将每个日期增加一天:

10/06/2018 变为 10/07/2018

所以,我试图在 gawk 的 system() 中使用 GNU 的 coreutils 'date' 命令(在 Linux Mint 环境中),但我的输出都是错误的(只有一列而不是整个文件,并且只有一个值重复)。

awk -i inplace -F'|' -v OFS='|' '$8=system("date -d " $8+1days " +%m/%d/%y")' file.csv

因为,正如 cmets 中公正指出的那样,'date' 不是 Bash 的一部分,而是一个外部命令,我还应该使用 system() 吗?

【问题讨论】:

  • date是外部命令,与bash无关。
  • 另外,你的日期格式是什么?如果 2018 年 7 月 10 日比 2018 年 6 月 10 日晚一天,那么您似乎并没有真正使用%d/%m/%y。让我们借此机会切换到 ISO8601 日期。派对就像 1988 年一样!
  • 另请注意,date 命令的用法和选项因操作系统而异。如果您想要一个可以在您的操作系统中运行的解决方案,最好包括什么操作系统,因为列表答案必然会受到更多限制。
  • 我正在研究一种 UNI EN 28601 格式,但由于日期(据我所知)只接受 mm/dd/yyyy,我用以前的命令转换了那个格式……忘了在此处更改。

标签: shell awk


【解决方案1】:

如果您使用gawk,则不需要系统调用

$ awk -i inplace 'BEGIN {FS=OFS="|"} 
                  {split($8,a,"/"); 
                   $8=strftime("%m/%d/%Y", mktime(a[3]" "a[1]" "a[2]" 00 00 00")+24*60*60)}1' file

【讨论】:

  • 嗯,必须清除,因为 OP 在他的代码中的格式与他写的内容不同。但很明显dateaa/bb/yyyy 翻译为'mm/dd/yyyy` 而不是dd/mm/yyyy
【解决方案2】:

+1 days 需要成为system 输入的一部分,并因此被引用。它也需要在 shell 级别引用。

awk -i inplace -F'|' -v OFS='|' '$8=system("date -d \""$8" +1 day\" +%d/%m/%y")' file.csv

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2016-08-27
    • 2017-02-18
    • 1970-01-01
    • 1970-01-01
    • 2014-09-06
    • 1970-01-01
    • 2016-10-08
    相关资源
    最近更新 更多