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
$