我正在尝试比较两个 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
使用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
如果带有三个逗号的模式(始终是第二个和第三个字段)\1
在制表符后重复 ( ),则进行替换s/\t.*/ match not found/
确实处理不匹配的情况