我想比较公共列上的 2 个相似文件并输出差异。这些文件将具有相同的标头。我希望看到特定专栏的差异。
第二个文件 File2 可以有额外的行,但我只想比较 file1 列-Column2 值与 file2 列-Column2 的匹配情况,并打印是否 Column3 值存在差异。
文件1
Column1,Column2,Column3
Demosvc1,Demopod1,70647625e1b016f8c2b21eae7465b30e0b0375ea
Demosvc2,Demopod2,<none>
Demosvc3,Demopod3,0b12b9218e1a572e994a6b616059a618e8f5d9a0
Demosvc4,Demopod4,ca9802f0636c23d20daad17498b26df000205626
Demosvc6,Demopod6,ca9802f0636c23d20daad17498b26df000205626
文件2
Column1,Column2,Column3
Demosvc1,Demopod1,70647625e1b016f8c2b21eae7465b30e0b0375ea
Demosvc2,Demopod2,20fd5948a80c5b06989f34b1c23a8e64afb7943e
Demosvc3,Demopod3,0b12b9218e1a572e994a6b616059a618e8f5d9a0
Demosvc4,Demopod4,551fbe73e835528da8269bac3652c6a64ecf4097
Demosvc5,Demopod5,4ae6230593c13b3a50e7b8e6cf0fe5fcc4a0fda2
Demosvc6,Demopod6,ca9802f0636c23d20daad17498b26df000205626
我希望像这样打印差异
所需输出
Demopod2,<none>,20fd5948a80c5b06989f34b1c23a8e64afb7943e
Demopod4,ca9802f0636c23d20daad17498b26df000205626,551fbe73e835528da8269bac3652c6a64ecf4097
答案1
awk -F',' '{
if (NR==FNR) a[$1$2]=$3
else if (a[$1$2]!="" && a[$1$2]!=$3) print $2","a[$1$2]","$3
}' file1 file2
当处理第一个文件时,将第三个字段的值保存在数组中,a
以第一个和第二个字段为键。
处理第二个文件时,比较键是否存在与第三个字段的值不匹配的非空数组值。如果是这种情况,请打印第二个字段、数组值和第三个字段。
答案2
使用米勒(https://github.com/johnkerl/miller)你可以运行
mlr --headerless-csv-output --csv join --lp l_ --rp r_ -f input_01.csv -j Column2 then \
cut -f Column2,l_Column3,r_Column3 then \
filter '$l_Column3!=$r_Column3' \
input_02.csv
获得
Demopod2,<none>,20fd5948a80c5b06989f34b1c23a8e64afb7943e
Demopod4,ca9802f0636c23d20daad17498b26df000205626,551fbe73e835528da8269bac3652c6a64ecf4097
一些注意事项:
join --lp l_ --rp r_ -f input_01.csv -j Column2
设置连接和输出的输出字段后缀名cut -f Column2,l_Column3,r_Column3
提取Column2和左右Column 3filter '$l_Column3!=$r_Column3'
过滤左 Column3 不等于右 Column3 的所有行
答案3
join --header -j2 -t, -o 1.2,1.3,2.3 FILE1 FILE2
- --header 将第一行视为标题
- -j2 连接到第 2 列
- -t 上的单独列,
- -o ... 打印 file1-column2 file1-column3 file2-column3
注意:join
要求输入文件在连接字段上排序。