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

0 linux sed awk

我正在尝试比较两个 csv 文件并更新第一个文件中的每个匹配行

例子 :

文件1.csv

col1,col2,col3,col4
1,11,111,1111
2,22,222,2222
3,33,333,3333
Run Code Online (Sandbox Code Playgroud)

文件2.csv

col1,col2,col3,col4
X,11,111,XXXX
Y,22,222,YYYY
Z,ZZ,ZZZ,ZZZZ
Run Code Online (Sandbox Code Playgroud)

现在我想比较这两个文件之间的 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
Run Code Online (Sandbox Code Playgroud)

sse*_*taH 6

使用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
Run Code Online (Sandbox Code Playgroud)

  • 一些评论将帮助新手了解 awk 的魅力:NR=到目前为止从输入读取的行数,FNR=仅从当前文件读取的行数。因此 NR==FNR 仅在读取第一个 txt 文件时才为真,而对于下一个文件 NR>FNR。NR==FNR { 动作 ; next } :允许描述读取第一个文件时要做什么(“下一个”指令绕过 awk 指令的其余部分并强制 awk 处理“下一个”行)。所以剩下的指令只有在 NR!=FNR 时才会执行(因为不会有“下一个”绕过它们)。 (2认同)