2013-02-25 13 views
8

Witam Mam dwa podobne pliki (oba z 3 kolumnami). Chciałbym sprawdzić, czy te dwa pliki zawierają te same elementy (ale wymienione w różnych zamówieniach). Przede wszystkim chciałbym porównać tylko 1st kolumnyPorównaj pliki z awk

plik1.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 

jaki sposób można zrobić to za pomocą awk? Próbowałem się rozejrzeć, ale znalazłem tylko skomplikowane przykłady. Co się stanie, jeśli chcę uwzględnić również pozostałe dwie kolumny w porównaniu? Wynik powinien dać mi liczbę pasujących elementów.

+0

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

Odpowiedz

25

Aby wydrukować wspólne elementy w obu plikach:

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

Objaśnienie:

NR i FNRawk zmienne przechowujące całkowitą liczbę rekordów i liczbę rekordów w obecnych plikach odpowiednio (domyślnym rekordem jest linia).

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 
} 

Jeśli chcesz, aby dopasować całe linie następnie użyć $0:

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

lub konkretnego zestawu kolumn:

$ 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

Głosowany specjalnie pod kątem wyjaśnienia skryptu awk, dziękuję! – vfilby

+0

@iiSeymour jak wydrukować 2. cloumn pliku 1, jeśli 1. cloumn pliku 2 znajduje się w tablicy asocjacyjnej? –

6

aby wydrukować liczbę pasujących elementów, oto jeden sposób użycia awk:

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

Wyniki wykorzystujące Twój wkład:

3 

Jeśli chcesz dodać kolejne kolumny (na przykład, kolumny jeden, dwa i trzy), użyć pseudo-multidimensional array:

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

wyników przy użyciu danych wejściowych:

2 
+0

+1. Ponieważ pliki OP mają tylko 3 kolumny, lepiej użyć po prostu 'a [$ 0]' zamiast 'a $ 1, $ 2, $ 3]. Jednak wszelkie niedopasowane niewidoczne spacje końcowe w jednym z plików mogą spowodować nieoczekiwany wynik. Może użyj do tego programu rtrim lub gsub. –

+1

Używane w ten sposób -> za $ awk 'FNR == NR {a [$ 1]; next}! (1 $ in a) END {print $ 1} 'test.csv test2.csv, aby wydrukować nie pasujące rekordy. – zee

+0

@zee: Dzięki za głosowanie, ale nie potrzebujesz swojego bloku 'END' – Steve