awk:将日期时间列拆分为 csv 中的三个单独的列

Lle*_*lop 2 linux awk csv

我正在尝试使用 substr 将日期时间列(第五个(previous_test))在末尾拆分为三个不同的列。

输入:

id,tester,company,chief,previous_test,test,date,result,cost
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96
Run Code Online (Sandbox Code Playgroud)

预期输出:

id,tester,company,chief,previous_test,test,date,result,cost,day,month,year
6582983b-61d4-4371-912d-bbc76bb8208b,Audrey Feest,Pagac-Gorczany,Claudine Moakson,18/02/2019,Passwords,20/05/2020,none,£11897.96,18,02,2019
Run Code Online (Sandbox Code Playgroud)

我试过使用:

awk -F, -v OFS="," '{s = substr($5, 1, 2)} {g = substr($5, 4, 2)} {l = substr($5, 7, 4)} {print s, g, l}' file.csv
Run Code Online (Sandbox Code Playgroud)

我得到的只是用逗号分隔的日期,而不是附加到现有列的三个附加列。

我缺少如何将输出附加到三个单独的列中。

Bod*_*odo 5

您的代码仅打印用于新列的子字符串值,而不是现有列。

您需要对第一行进行特殊处理。

awk -F, -v OFS="," 'NR==1 { print $0,"day,month,year"; next }
{ s = substr($5, 1, 2);
  g = substr($5, 4, 2);
  l = substr($5, 7, 4);
  print $0, s, g, l}' file.csv
Run Code Online (Sandbox Code Playgroud)

印刷

awk -F, -v OFS="," 'NR==1 { print $0,"day,month,year"; next }
{ s = substr($5, 1, 2);
  g = substr($5, 4, 2);
  l = substr($5, 7, 4);
  print $0, s, g, l}' file.csv
Run Code Online (Sandbox Code Playgroud)

解释:

  • 该条件NR==1对第一条记录/行有效。
  • $0 是整个输入记录/行
  • next命令跳转到下一个记录/行,跳过所有剩余命令当前记录/线。这意味着将针对除第一个之外的所有记录/行执行其他命令。

编辑:正如Olivier Dulac的评论中所建议的,可以使用该split函数简化日期字符串的拆分。

awk -F, -v OFS="," 'NR==1 { print $0,"day,month,year"; next }
{ split($5,a,"/"); print $0, a[1], a[2], a[3] }' file.csv
Run Code Online (Sandbox Code Playgroud)