行間に空の新しい行を作成せずにAWKを使用して、csvファイルに値を含む新しい列を追加します。

行間に空の新しい行を作成せずにAWKを使用して、csvファイルに値を含む新しい列を追加します。

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

おすすめ記事