私は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