我正在尝试使用 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)
我得到的只是用逗号分隔的日期,而不是附加到现有列的三个附加列。
我缺少如何将输出附加到三个单独的列中。
您的代码仅打印用于新列的子字符串值,而不是现有列。
您需要对第一行进行特殊处理。
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)