2013-11-01 46 views
1

我有2個(虛擬)文件找茬(AWK)

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 

我不知道我的方法是否好,但我首先將年齡解析爲另一個文件並進行比較。如果它們不同,我會查看哪些行號是不同的。然後我會回到原始文件並解析THAT行的人名。

我運行以下代碼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 

但是,我在這裏封鎖。我不知道我的方法是對的還是有一個更簡單的方法。

非常感謝

回答

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 
+0

爲什麼商店'$ 0'在'了'再後來把它分解獲得'$ 2'而不是隻在'a'中存儲'$ 2'?您也可以在打印中使用'ARGV []'或者使用'FILENAME'來代替硬編碼文件名。 –

+1

根據相應編輯 –

1

如果兩個文件列出了相同的名稱,像這樣的工作:

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

加入要求輸入先排序。 –

+0

@sudo_O如果所有行都可以配對,GNU加入至少似乎放寬了這個要求,並且可以完美地運行原始海報給出的文件。 – user2719058

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

你不想在字段上進行正則表達式比較,你只需要'!='。 –

+0

@sudo_O感謝您的評論。更新了答案。我認爲正則表達式不會受到傷害。 – jkshah