Szukaj…


Sprawdź pasujące pola w dwóch plikach

Biorąc pod uwagę te dwa pliki CSV:

$ cat file1
1,line1
2,line2
3,line3
4,line4
$ cat file2
1,line3
2,line4
3,line5
4,line6

Aby wydrukować te wiersze w file2 których druga kolumna występuje również w pierwszym pliku, możemy powiedzieć:

$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines' file1 file2
1,line3
2,line4

Tutaj lines[] zawierają tablicę, która jest zapełniana podczas odczytu file1 zawartością drugiego pola każdej linii.

Następnie warunek $2 in lines sprawdza, dla każdego wiersza w file2 , czy 2. pole istnieje w tablicy. Jeśli tak, warunkiem jest Prawda, a awk wykonuje domyślną akcję polegającą na wydrukowaniu pełnej linii.

Jeśli trzeba wydrukować tylko jedno pole, może to być wyrażenie:

$ awk -F, 'FNR==NR {lines[$2]; next} $2 in lines {print $1}' file1 file2
1
2

Drukuj zmienne awk podczas czytania dwóch plików

Mam nadzieję, że ten przykład pomoże wszystkim zrozumieć, jak zmieniają się wewnętrzne zmienne awk, takie jak NR, FNR itp., Gdy awk przetwarza dwa pliki.

awk '{print "NR:",NR,"FNR:",FNR,"fname:",FILENAME,"Field1:",$1}' file1 file2
NR: 1 FNR: 1 fname: file1 Field1: f1d1
NR: 2 FNR: 2 fname: file1 Field1: f1d5
NR: 3 FNR: 3 fname: file1 Field1: f1d9
NR: 4 FNR: 1 fname: file2 Field1: f2d1
NR: 5 FNR: 2 fname: file2 Field1: f2d5
NR: 6 FNR: 3 fname: file2 Field1: f2d9

Gdzie wyglądają plik 1 i plik 2:

$ cat file1
f1d1 f1d2 f1d3 f1d4

$ cat file2
f2d1 f2d2 f2d3 f2d4

Zauważ, że wartość NR stale rośnie wśród wszystkich plików, podczas gdy FNR resetuje się dla każdego pliku. Dlatego wyrażenie NR==FNR zawsze odnosi się do pierwszego pliku dostarczonego do awk, ponieważ tylko w pierwszym pliku możliwe jest, aby NR równy FNR .



Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow