检查Bash中两个列表的更改

时间:2016-09-02 10:43:52

标签: bash awk

我有这两个文件包含一个项目列表,每个项目的数量用空格分隔。这些列表应该已经订购,并且每个列表总是具有相同数量的项目,但是我更希望制作依赖于项目名称而不依赖于行号的代码。

我需要输出只存在更改的输出,例如每个已更改其关联值的项目的diff。我知道我可以使用meldawk,但我需要一个非常具体的输出,因为我必须为每一个变化发送邮件,所以我想我应该使用的东西比如cat before.txt Apples 3 Oranges 5 Bananas 7 Avocados 2 cat after.txt Apples 3 Oranges 7 Bananas 7 Avocados 3 output wanted: Oranges has changed form 5 to 7 Avocados has changed form 2 to 3

6

2 个答案:

答案 0 :(得分:2)

awk是你的朋友

 awk 'NR==FNR{price[$1]=$2;next}
      $1 in price{
       if(price[$1]!=$2){
        printf "%s has changed from %s to %s%s",$1,price[$1],$2,ORS
       }
    }' before.txt after.txt

<强>输出

Oranges has changed from 5 to 7
Avocados has changed from 2 to 3

如果您是awk新手,请考虑购买Arnold Robbins的[ Effective awk Programming ]

答案 1 :(得分:0)

没有其他答案那么好,但很容易理解。这不是一个非常经济的方式来完成这项任务,但是我已经添加了它,因为它使事情变得简单。当然,如果表现不是真正的问题。

paste before.txt after.txt | awk '$2!=$4 {print $1 " are changes from " $2 " to " $4}'
Oranges are changes from 5 to 7
Avocados are changes from 2 to 3