【问题标题】:Comparing five columns of two different files and printing the differences of only two columns using awk比较两个不同文件的五列并使用 awk 仅打印两列的差异
【发布时间】:2021-05-04 13:53:40
【问题描述】:

所以我有如下所示的第一个文件:

first.txt:

id|name|place|cost|member|
1|max|USA|55|yes|
2|Jhon|France|99|No|
3|Mary|Canada|777|yes|
4|Berry|USA|888|yes|
5|Stella|Mexico|100|yes|

还有文件 second.txt:

id|name|place|cost|member|
1|max|USA|55|No|
2|Jhon|France|99|No|
3|Mary|Canada|770|yes|
4|Berry|USA|888|yes|
5|Stella|Mexico|101|No|

所以在这里我想根据应该相同的前三个列比较这两个文件,如果它们存在于第 4 列和第 5 列中,则打印差异

在这个例子中,我想要的输出是:

对于 id: 1 和 name: max 和 country: USA 成员从 Yes 更改为 No

对于 id:3 和 name:Mary 和国家:Canada,费用从 777 更改为 770

对于 id:5 和 name:Stella 和国家:Mexico,费用从 100 更改为 101,会员从 Yes 更改为 No

知道我的文件可能包含数千行并且大小不同。

我尝试了 awk 命令,但无法将差异和相似性结合起来,而且输出缺少行,而且打印不知道放在哪里:

awk -F'|' 'NR++FNR{C[$1,$2,$3]++;C[$4,$5]++; next} C[$1,$2,$3] > 0 && C[$4,$5] == 0'

【问题讨论】:

  • 不做更深入的检查,NR++FNR应该是NR==FNR

标签: linux shell awk compare


【解决方案1】:

这应该让你开始

$ awk -F'|'   '{k=$1 FS $2 FS $3} 
     NR==1     {split($0,h)}
     NR==FNR   {f4[k]=$4; f5[k]=$5; next} 
     f4[k]!=$4 {print k, h[4] " changed from " f4[k] " to " $4}' file1 file2

3|Mary|Canada cost changed from 777 to 770
5|Stella|Mexico cost changed from 100 to 101

对字段 5 执行相同操作,您也可以以详细格式打印密钥。列名保存在h[] 数组中。

【讨论】:

  • 非常感谢您及时明确的回答!我在想是否有一种方法可以仅在前 3 列存在于两个文件中的情况下打印此输出,并且在 id、name 和 place 仅对一个文件唯一的情况下不打印,谢谢!
  • 您可以在值匹配语句之前添加检查!(k in f4){next}以跳过不匹配的键。
猜你喜欢
  • 2020-12-13
  • 2013-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-03
  • 2015-10-22
  • 1970-01-01
  • 2013-06-17
相关资源
最近更新 更多