比较两个文件 file1 和 file 2 中的特定列并更新文件 1 中的每个匹配行

比较两个文件 file1 和 file 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

使用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/确实处理不匹配的情况

相关内容