我没有awk
单独使用,但如果我理解你所要求的要点,我认为这个长单行应该可以做到......
join -t, -a 1 -a 2 -o 1.1 2.1 1.2 2.2 file1.csv file2.csv | awk -F, '{ if ( $3 == $4 ) var = "\"Match\""; else var = "\"Unmatch\"" ; print $1","$2","var }' | sed -e '1d' -e 's/^,/"",/' -e 's/,$/,"" /' -e 's/,,/,"",/g'
描述:
- 该
join
部分采用两个 CSV 文件,将它们连接到第一列(默认行为join
)并输出所有四个字段 ( -o 1.1 2.1 1.2 2.2
),确保包含两个文件都不匹配的行 ( -a 1 -a 2
)。
- 该
awk
部分采用该输出并将第 3 列和第 4 列的组合替换为"Match"
或"Unmatch"
基于它们是否确实匹配。我不得不根据您的示例对这种行为做出假设。
- 该
sed
部分从输出 ( ) 中删除 "no","loc" 标头,-e '1d'
并用开闭引号 ( -e 's/^,/"",/' -e 's/,$/,""/' -e 's/,,/,"",/g'
) 替换空字段。最后一部分对您来说可能不是必需的。
编辑:正如tripleee 指出的那样,如果两个初始文件未排序,上述操作将失败。这是一个更新的命令来解决这个问题。它在将每个文件传递给加入之前将标题行和排序...
join -t, -a 1 -a 2 -o 1.1 2.1 1.2 2.2 <( sed 1d file1.csv | sort ) <( sed 1d file2.csv | sort ) | awk -F, '{ if ( $3 == $4 ) var = "\"Match\""; else var = "\"Unmatch\"" ; print $1","$2","var }' | sed -e 's/^,/"",/' -e 's/,$/,""/' -e 's/,,/,"",/g'