2013-02-25 23 views
8

Xin chào, tôi có hai tệp tương tự (cả hai đều có 3 cột). Tôi muốn kiểm tra xem hai tệp này có chứa các phần tử giống nhau hay không (nhưng được liệt kê theo một thứ tự khác). Trước hết tôi muốn so sánh chỉ có các cột 1So sánh các tệp với awk

file1.txt

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

file2.txt

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

Làm thế nào tôi có thể làm điều đó bằng awk? Tôi đã cố gắng để có một cái nhìn xung quanh nhưng tôi đã tìm thấy chỉ các ví dụ phức tạp. Điều gì sẽ xảy ra nếu tôi muốn bao gồm cả hai cột còn lại trên so sánh? Đầu ra sẽ cho tôi số phần tử phù hợp.

+0

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

Trả lời

25

Để in yếu tố chung trong cả hai tập tin:

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

Giải thích:

NRFNRawk biến lưu trữ tổng số hồ sơ và số lượng hồ sơ trong các tập tin hiện tại tương ứng (bản ghi mặc định là một dòng).

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 
} 

Nếu bạn muốn kết hợp toàn bộ dây chuyền sau đó sử dụng $0:

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

Hoặc một tập hợp cụ thể của cột:

$ 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

Bình chọn đặc biệt vì lời giải thích của kịch bản awk, cảm ơn bạn! – vfilby

+0

@iiSeymour làm thế nào để in cloumn thứ 2 của file1 nếu cloumn đầu tiên của file2 được tìm thấy trong mảng kết hợp? –

6

Để in số lượng phù hợp với các yếu tố, đây là một cách sử dụng awk:

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

Kết quả sử dụng đầu vào của bạn:

3 

Nếu bạn muốn thêm cột phụ (ví dụ, cột một, hai và ba), sử dụng một pseudo-multidimensional array:

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

Kết quả sử dụng thông tin bạn nhập:

2 
+0

+1. Vì các tệp của OP chỉ có 3 cột, có thể tốt hơn là chỉ sử dụng 'a [$ 0]' thay vì 'a [$ 1, $ 2, $ 3]'. Nhưng sau đó bất kỳ không gian dấu vết vô hình chưa từng có trong một trong hai tệp có thể gây ra kết quả không mong muốn. Có thể sử dụng rtrim hoặc gsub cho điều đó. –

+1

Sử dụng nó như thế này -> za $ awk 'FNR == NR {a [$ 1]; next}! ($ 1 trong a) END {print $ 1} 'test.csv test2.csv để in các bản ghi chưa khớp. – zee

+0

@zee: Cảm ơn bạn đã bỏ phiếu, nhưng bạn không cần khối 'END' – Steve