Linux

比較兩個文件 file1 和文件 2 中的特定列並更新文件 1 中的每個匹配行

  • August 17, 2022

我正在嘗試比較兩個 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

現在我想比較這兩個文件之間的 col2 和 col3,如果找到匹配,則更新文件一以匹配行。

輸出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) 文件中除了欄位分隔文件之外沒有逗號,並且 (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 輸入,後跟製表鍵)

  • 1s/\t.*//p列印第一行,首先刪除重複項;1d然後停止第一行的進一步操作
  • s/\(,.*,.*,\)\(.*\)\t.*\1.*/\1\2 match found/如果在製表符後s重複 ( ) 帶有三個逗號的模式(總是第二和第三欄位),則進行替換\1
  • s/\t.*/ match not found/確實處理不匹配的情況

使用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

引用自:https://unix.stackexchange.com/questions/713905