2013-02-25 83 views
8

嗨,我有兩個相似的文件(都有3列)。我想檢查這兩個文件是否包含相同的元素(但以不同的順序列出)。首先我想用awk比較文件

"xyz" 0 0 
"aba" 0 0 
"xxx" 0 0 
"abc" 1 1 

我怎麼能做到這一點用awk只比較第一列

FILE1.TXT

"aba" 0 0 
"abc" 0 1 
"abd" 1 1 
"xxx" 0 0 

FILE2.TXT?我試圖看看,但我發現只有複雜的例子。如果我還想在比較中包括另外兩列呢?輸出應該給我匹配元素的數量。

+0

http://theunixshell.blogspot.in/2012/12/i-have-two-files-file-1-conta ins-3.html – Vijay 2014-03-29 13:48:12

回答

25

要打印普通元素在這兩個文件:

$ awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2 
"aba" 
"abc" 
"xxx" 

說明:

NRFNR是存儲的記錄總數和記錄當前文件的數量awk變量(默認記錄是一行)。

NR==FNR # Only true when in the first file 
{ 
    a[$1] # Build associative array on the first column of the file 
    next # Skip all proceeding blocks and process next line 
} 
($1 in a) # Check in the value in column one of the second files is in the array 
{ 
    # If so print it 
    print $1 
} 

如果你要匹配的整行,然後使用$0

$ awk 'NR==FNR{a[$0];next}$0 in a{print $0}' file1 file2 
"aba" 0 0 
"xxx" 0 0 

或特定的一組列:

$ awk 'NR==FNR{a[$1,$2,$3];next}($1,$2,$3) in a{print $1,$2,$3}' file1 file2 
"aba" 0 0 
"xxx" 0 0 
+0

由於awk腳本的解釋而特別投票,謝謝! – vfilby 2016-02-24 05:00:01

+0

@iiSeymour如果在關聯數組中找到file2的第一個cloumn,如何打印file1的第二個cloumn? – 2017-03-06 06:26:37

6

要打印匹配元件的數量,這裏有一個使用方法awk

awk 'FNR==NR { a[$1]; next } $1 in a { c++ } END { print c }' file1.txt file2.txt 

結果使用您的輸入:

3 

如果你想添加額外的列(例如,列一,二,三層),使用pseudo-multidimensional array

awk 'FNR==NR { a[$1,$2,$3]; next } ($1,$2,$3) in a { c++ } END { print c }' file1.txt file2.txt 

結果使用你的輸入:

2 
+0

+1。由於OP的文件只有3列,所以使用'a [$ 0]'而不是'a [$ 1,$ 2,$ 3]'會更好。但是,任何文件中的任何不匹配的不可見尾隨空格都可能導致意外輸出。也許使用rtrim或gsub。 – 2013-06-03 21:15:39

+1

像這樣使用它 - > za $ awk'FNR == NR {a [$ 1];下一步}!($ a中)END {print $ 1}'test.csv test2.csv打印不匹配的記錄。 – zee 2017-08-22 04:15:57

+0

@zee:感謝您的投票,但您不需要您的「END」塊 – Steve 2017-08-22 05:36:48