2つのCSVファイルがあります。
成功.csv
「ID」、「既存ID」、「フィールド1」、「フィールド2」
1,1111,google,news
2,2222,yahoo,news
エラー.csv
「既存ID」、「フィールド1」、「フィールド2」、「メッセージ」
3333,aol,news,"Failed to upload data"
4444,cbs,news,"Alredy exists"
これら2つのファイルをマージして、次のように新しいファイルを作成するにはどうすればよいですか?フィールドのサイズと順序が変わり続けるため、インデックスは使用できません。
結果.csv
「ID」、「既存ID」、「メッセージ」
1,1111,""
2,2222,""
"",3333,"Failed to upload data"
"",4444,"Alredy exists"
要件は、sumで3つの列のみをresults.csv
含むファイルを作成することです。success.csv
error.csv
行が正常にロードされると、成功ファイルの最初の列として「ID」が表示され、「メッセージ」列は表示されません。
失敗すると、常にファイルの最後のフィールドである「メッセージ」フィールドにエラーが発生します。この場合、「ID」は空です。
読み取った値は次のとおりですsuccess.csv
。
awk '{print $1, $2;}' success.csv
読み取った値は次のとおりですerror.csv
。
awk '{print $1, NF;}' error.csv
これら2つのステートメントを組み合わせて結果をファイルに書き込む方法を見つけることができません。
ベストアンサー1
質問は明確ではありませんが、次の構造を探していると思います。
awk 'BEGIN{FS=OFS=","}NR==FNR{print $1,$2,"\"\"";next}{print "\"\"",$1,$NF}' success.csv error.csv
説明する:
- まず最初に、フィールド区切り記号(
FS
)と出力フィールド区切り記号(OFS
)を次のように設定しました。,
- 両方のファイルを同時に処理しますが、どのファイルが処理されているかを確認します。 1つ目は、現在の行番号が
NR==FNR
現在のファイルの現在の行番号と等しい場合に処理されます()。 - したがって、最初のファイル(
success.csv
)にはを印刷し、$1,$2,"\"\""
2番目のファイル(error.csv
)にはを印刷します"\"\"",$1,$NF
。
結果:
1,1111,""
2,2222,""
"",3333,"Failed to upload data"
"",4444,"Alredy exists"