2つのファイルfile1とfile2の特定の列を比較し、ファイル1の一致する各行を更新します。

2つのファイルfile1とfile2の特定の列を比較し、ファイル1の一致する各行を更新します。

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/s3つのカンマ(常に2番目と3番目のフィールド)を持つパターンがタブ()\1の後に繰り返される場合
  • s/\t.*/ match not found/不一致のケースを処理します。

関連情報