csv 使用awk从日期列中减去固定天数并将其添加到新列中

rn0zuynd  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(99)

假设我们有一个文件,其值如下所示:

% head test.csv
20220601,A,B,1
20220530,A,B,1

我们希望添加两个新列,一个日期为负1天,另一个日期为负7天,结果如下:

% head new_test.csv
20220601,A,B,20220525,20220531,1
20220530,A,B,20220523,20220529,1

用于生成上述内容的awk是:
第一个月
但是在一个超过100K行的大文件中应用上面的方法后,它运行了20分钟,有什么方法可以优化awk吗?

8gsdolmq

8gsdolmq1#

一种GNU awk方法:

awk '
BEGIN { FS=OFS=","
        secs_in_day = 60 * 60 * 24
      }
      { dt = mktime( substr($1,1,4) " " substr($1,5,2) " " substr($1,7,2) " 12 0 0" )
        dt1 = strftime("%Y%m%d",dt -  secs_in_day      )
        dt7 = strftime("%Y%m%d",dt - (secs_in_day * 7) )
        print $1,$2,$3,dt7,dt1,$4
      }
' test.csv

这将产生:

20220601,A,B,20220525,20220531,1
20220530,A,B,20220523,20220529,1
    • 注:**
  • mktime()strftime()函数需要GNU awk;有关详细信息,请参见GNU awk time functions
  • awk的其它风格可以具有类似的功能ymmv

相关问题