Linux
比較兩個文件 file1 和文件 2 中的特定列並更新文件 1 中的每個匹配行
我正在嘗試比較兩個 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