awk:csvの日付/時刻列を3つの別々の列に分割する

awk:csvの日付/時刻列を3つの別々の列に分割する

私はsubstrを使用して日付/時刻列、5番目の列(previous_test)を最後の3つの異なる列に分割しようとしています。

入力する:

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

予想出力:

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

私は以下を試してみました。

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

私が得るのは、既存の列に追加された3つの追加列の代わりにカンマ区切りの日付だけです。

出力を3つの別々の列に追加する方法がありません。

ベストアンサー1

コードは、既存の列ではなく、新しい列の部分文字列値のみを印刷します。

最初の行には特別な処理が必要です。

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

印刷

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

説明する:

  • この条件はNR==1最初のレコード/行に有効です。
  • $0完全な入力レコード/行です。
  • このnextコマンドは次のレコード/行にジャンプし、現在のレコード/行に残っているすべてのコマンドをスキップします。これは、最初のレコード/行を除くすべてのレコード/行に対して追加のコマンドが実行されることを意味します。

編集する:コメントで提案したようにオリヴィエ・デュラク、この関数を使用して日付文字列の分割を簡素化できます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

おすすめ記事