Uczę się porównywania plików za pomocą awk
.
Znalazłem składnię jak poniżej,
awk 'NR==FNR{a[$1];next}$1 in a{print $1}' file1 file2
Nie mogłem zrozumieć, jakie to ma znaczenie NR==FNR
? Jeśli spróbuję z, FNR==NR
to również otrzymam ten sam wynik?
Co to właściwie robi?
a==b
ib==a
wyprodukował sam wynik?Two-file Processing
na backreference.org/2010/02/10/idiomatic-awkOdpowiedzi:
W awk
FNR
odnosi się do numeru rekordu (zazwyczaj numeru wiersza) w bieżącym pliku iNR
odnosi się do całkowitej liczby rekordów. Operator==
jest operatorem porównania, który zwraca prawdę, gdy dwa otaczające operandy są równe.Oznacza to, że warunek
NR==FNR
jest prawdziwy tylko dla pierwszego pliku, ponieważFNR
resetuje się z powrotem do 1 dla pierwszego wiersza każdego pliku, aleNR
wciąż rośnie.Ten wzorzec jest zwykle używany do wykonywania działań tylko na pierwszym pliku.
next
Wewnątrz środków blokowych jakiekolwiek kolejne polecenia są pomijane, więc są one uruchamiane tylko na plikach innych niż pierwszy.Warunek
FNR==NR
porównuje te same dwa operandy coNR==FNR
, więc zachowuje się w ten sam sposób.źródło
a='3x'; if [[ $a == 3* ]]; then echo yes; fi
i nie można przełączać obu stron==
.Poszukaj kluczy (pierwsze słowo wiersza) w pliku2, które również znajdują się w pliku1.
Krok 1: Wypełnij tablicę a pierwszymi słowami z pliku 1:
Krok 2: Wypełnij tablicę a i zignoruj plik 2 w tym samym poleceniu. W tym celu sprawdź łączną liczbę rekordów do tej pory z numerem bieżącego pliku wejściowego.
Krok 3: Zignoruj akcje, które mogą nastąpić po
}
podczas analizowania pliku 1Krok 4: wydrukuj klucz pliku2, gdy zostanie znaleziony w tablicy a
źródło
;next
jest to dziwny dodatek (lubię dodaćnext
i potrzebuję średnika w kroku 3). Możesz przetestować krok 1 za pomocąawk '{a[$1]} END { for (k in a) { print "a[k]=" k } }' file1
.Zajrzyj w górę
NR
iwFNR
podręczniku awk, a następnie zadaj sobie pytanie, jaki jest warunekNR==FNR
w poniższym przykładzie:źródło
ARGIND
, w przeciwnym razie możesz to zrobićFNR==1{ print ++file_nr }
.Istnieją
awk
zmienne wbudowane.NR
- Podaje całkowitą liczbę przetworzonych rekordów.FNR
- Podaje całkowitą liczbę rekordów dla każdego pliku wejściowego.źródło
Zakładając, że masz pliki a.txt i b.txt z rozszerzeniem
Należy pamiętać, że NR i FNR to zmienne wbudowane w awk. NR - podaje całkowitą liczbę przetworzonych rekordów. (w tym przypadku zarówno w a.txt, jak i b.txt) FNR - podaje całkowitą liczbę rekordów dla każdego pliku wejściowego (rekordy w formacie a.txt lub b.txt)
pozwala dodać „następny”, aby pominąć pierwszy dopasowany z NR == FNR
w b.txt i a.txt
w b.txt, ale nie w a.txt
źródło