Załóżmy, że chcesz zastąpić wiersz 4 tekstem „inny”. Możesz używać AWK w następujący sposób:
awk '{ if (NR == 4) print "different"; else print $0}' input_file.txt > output_file.txt
AWK traktuje dane wejściowe jako „rekordy” podzielone na „pola”. Domyślnie jeden wiersz to jeden rekord. NR
to liczba wyświetlonych rekordów. $0
reprezentuje bieżący pełny rekord (gdzie $1
jest pierwszym polem z rekordu i tak dalej; domyślnie pola są słowami z wiersza).
Tak więc, jeśli bieżący numer wiersza to 4, wypisuje łańcuch „inny”, ale w przeciwnym razie wypisuje wiersz bez zmian.
W AWK kod programu zawarty w jest { }
uruchamiany raz na każdym rekordzie wejściowym.
Musisz cytować program AWK w pojedynczych cudzysłowach, aby powłoka nie próbowała interpretować rzeczy takich jak $0
.
EDYCJA: Krótszy i bardziej elegancki program AWK od @chepner w komentarzach poniżej:
awk 'NR==4 {$0="different"} { print }' input_file.txt
Tylko dla rekordu (tj. Linii) numer 4, zastąp cały rekord ciągiem „różne”. Następnie wydrukuj rekord dla każdego rekordu wejściowego.
Najwyraźniej moje umiejętności AWK są zardzewiałe! Dziękuję @chepner.
EDYCJA: i zobacz także jeszcze krótszą wersję od @Dennis Williamson:
awk 'NR==4 {$0="different"} 1' input_file.txt
Jak to działa, wyjaśniono w komentarzach: 1
zawsze zwraca wartość true, więc powiązany blok kodu zawsze działa. Ale nie ma powiązanego bloku kodu, co oznacza, że AWK wykonuje swoją domyślną akcję, po prostu wypisuje całą linię. AWK został zaprojektowany, aby zezwalać na takie zwięzłe programy.