找到第二个字段的差异,使用第一个字段报告(awk)

时间:2013-11-01 20:23:44

标签: shell awk difference

我有2个(虚拟)文件

FILE1.TXT

Tom 25
John 27
Bob 22
Justin 37
Nick 19
Max 42

FILE2.TXT

Tom 25
John 40
Bob 22
Justin 37
Nick 19
Max 24

我想比较这些文件的第二个字段(数字)。然后,如果它们不同,请使用“第一个”字段(名称)进行报告。因此预期的输出将如下。

John's age in file1.txt is different from file2.txt
Max's age in file1.txt is different from file2.txt

我不知道我的方法是否合适但我首先将年龄解析为另一个文件并进行比较。如果它们不同,我会查看哪个行号是不同的。然后我将回到原始文件并从该行解析该人的姓名。

我在 shell 中运行以下代码。

$  awk '{print $2}' file1.txt > tmp1.txt
$  awk '{print $2}' file2.txt > tmp2.txt
$
$  different=$(diff tmp1.txt tmp2.txt | awk '{$1=""; print $0')
$
$  if ["${different}"]; then
$     #This is to get the line number where the ages are different
$     #so that I can go to THAT line in file1.txt and get the first field.
$     awk 'NR==FNR{a[$0];next}!($0 in a){print FNR}' tmp1.txt tmp2.txt > lineNumber.txt
$  fi

但是,我在这里被封锁了。我不知道我的方法是否正确,或者是否有更简单的方法。

非常感谢

3 个答案:

答案 0 :(得分:4)

awk 'NR==FNR{a[$1]=$2;next} $2!=a[$1]{print "Age of "$1" is different"}' file1 file2

答案 1 :(得分:1)

awk '
    NR==FNR{a[$1]=$2;next}
    a[$1] != $2 {print $1"\047s age in "ARGV[1]" is different from "ARGV[2]}
' file1.txt file2.txt

答案 2 :(得分:1)

如果两个文件都列出相同的名称,则可以使用以下内容:

join file{1,2}.txt | awk '$2 != $3 { print "Age of " $1 " is different" }'