比较2个逗号分隔的文件并输出差异

比较2个逗号分隔的文件并输出差异

我想比较公共列上的 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 3
  • filter '$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要求输入文件在连接字段上排序。

相关内容