我想在 csv 文件的末尾添加一个新列,并用值填充该列。我使用了以下代码,最终在每条记录之间显示新的空白行。请让我知道如何避免这些新添加的空行。
awk -F "," 'NR == 1 {$5="MonthYear"}{ if (NR>1){split($2,a,"[/ ]");$5=a[1]"/"a[3]}}1' RS='\r' OFS="," Test.csv > Test1.csv
尝试使用 RS='\n' 和 RS='\r\n' 仍然得到相同的结果
输入文件 - Test.csv
Id Day UserId ItemId
1 12/1/17 0:03 2323 tv
2 12/14/17 7:10 4546 frr
3 1/22/18 14:11 2421 fdf
4 2/16/18 13:36 4545 dfdf
5 3/5/18 10:47 1232 dfsdf
实际输出文件 - Test1.csv
Id Day UserId ItemId MonthYear
1 12/1/17 0:03 2323 tv 12/17
2 12/14/17 7:10 4546 frr 12/17
3 1/22/18 14:11 2421 fdf 1/18
4 2/16/18 13:36 4545 dfdf 2/18
5 3/5/18 10:47 1232 dfsdf 3/18
预期输出 - csv
Id Day UserId ItemId MonthYear
1 12/1/17 0:03 2323 tv 12/17
2 12/14/17 7:10 4546 frr 12/17
3 1/22/18 14:11 2421 fdf 1/18
4 2/16/18 13:36 4545 dfdf 2/18
5 3/5/18 10:47 1232 dfsdf 3/18
如果没有 RS,输出会像这样混乱:
,MonthYearrId,ItemId
,12/17/17 0:03,2323,tv
,12/174/17 7:10,4546,frr
,1/182/18 14:11,2421,fdf
,2/186/18 13:36,4545,dfdf
5,3/5/18 10:47,1232,dfsdf,3/18
答案1
我可以重现您的问题的唯一方法是文件是否实际上包含分号作为分隔符和每行以一对结束\r\n
。当发生这种情况时,使用\r
作为 RS 会导致\n
出现在下一行。
使用的源文件:
Id,Day,UserId,ItemId
1,12/1/17 0:03,2323,tv
2,12/14/17 7:10,4546,frr
3,1/22/18 14:11,2421,fdf
4,2/16/18 13:36,4545,dfdf
5,3/5/18 10:47,1232,dfsdf
最简单的解决方案是删除\r
文件中的 (也许使用 dos2unix)。
在 awk 中更容易做到这一点:
$ awk '{gsub(/\r/,"")}; NR==1 {print $0,"MonthYear"}; NR>1 {print $0,$2"/"$4}' FS="[,/ ]" OFS=, Test.csv
Id,Day,UserId,ItemId,MonthYear
1,12/1/17 0:03,2323,tv,12/17
2,12/14/17 7:10,4546,frr,12/17
3,1/22/18 14:11,2421,fdf,1/18
4,2/16/18 13:36,4545,dfdf,2/18
5,3/5/18 10:47,1232,dfsdf,3/18
答案2
我能够通过使用从输出文件中删除空白记录来解决这个问题
sed '/^ *$/d' Test1.csv > Test2.csv
答案3
另一种awk
方法
$ awk '{print $0,NR==1?" MonthYear":substr($2,0,index($2,"/"))substr($2,length($2)-1)}' Test.csv
Id Day UserId ItemId MonthYear
1 12/1/17 0:03 2323 tv 12/17
2 12/14/17 7:10 4546 frr 12/17
3 1/22/18 14:11 2421 fdf 1/18
4 2/16/18 13:36 4545 dfdf 2/18
5 3/5/18 10:47 1232 dfsdf 3/18
$