2つのCSVファイルを比較し、最初のファイルで一致する各行を更新しようとしています。
例:
ファイル1.csv
col1,col2,col3,col4
1,11,111,1111
2,22,222,2222
3,33,333,3333
ファイル2.csv
col1,col2,col3,col4
X,11,111,XXXX
Y,22,222,YYYY
Z,ZZ,ZZZ,ZZZZ
この2つのファイル間のcol2とcol3を比較し、一致するものが見つかったら、ファイル1を更新して一致する行を取得しようとしています。
出力file1.csv
:
col1,col2,col3,col4
1,11,111,1111 match found
2,22,222,2222 match found
3,33,333,3333 match not found
答え1
使用awk
$ awk -F, 'NR==FNR {a[$2,$3];next} FNR>1 {$0=$0 (($2,$3) in a?" match found" : " match not found")}1' file2.csv file1.csv
col1,col2,col3,col4
1,11,111,1111 match found
2,22,222,2222 match found
3,33,333,3333 match not found
答え2
(1)フィールド区切り文字を除いてファイルにカンマがなく、(2)両方のフィールドが一致する必要がある場合は、paste
次のコマンドを使用して一致をファイル化して処理できますsed
。
paste file1.csv file2.csv | sed '1s/\t.*//p;1d;s/\(,.*,.*,\)\(.*\)\t.*\1.*/\1\2 match found/;s/\t.*/ match not found/'
(\t
リテラルタブ文字を表し、ctrl-vで入力してTabキーを押します)
1s/\t.*//p
最初の行を印刷し、最初に重複項目を削除してから、最初の行で追加のジョブを停止します1d
。s/\(,.*,.*,\)\(.*\)\t.*\1.*/\1\2 match found/
s
3つのカンマ(常に2番目と3番目のフィールド)を持つパターンがタブ()\1
の後に繰り返される場合s/\t.*/ match not found/
不一致のケースを処理します。