Pomiń pierwsze 6 linii / wierszy w pliku tekstowym za pomocą awk

39

Jak mogę pominąć pierwsze 6 linii / wierszy w pliku tekstowym (input.txt), a resztę przetworzyć za pomocą awk? Format mojego skryptu awk (program.awk) jest następujący:

BEGIN {
} 

{ 
process here
} 

END {

}

Mój plik tekstowy wygląda następująco:

0
3
5
0.1 4.3
2.0 1.5
1.5 3.0
0.3 3.3
1.5 2.1
.
.
.

Chcę przetworzyć plik, zaczynając od:

0.3 3.3
1.5 2.1
.
.
.
amatek
źródło

Odpowiedzi:

59

Użyj jednego z dwóch wzorów:

NR>6 { this_code_is_active }

albo to:

NR<=6 { next }
{ this_code_is_active }

Użyj FNR zamiast NR, jeśli masz wiele plików jako argumentów do awk i chcesz pominąć 6 linii w każdym pliku.

Janis
źródło
29

Próbować:

awk 'FNR > 6 { #process here }' file
Cuonglm
źródło
4
Dobry! Ale nie wyjaśniłeś, dlaczego jest to lepsze - w przypadku wielu plików FNRjest to numer wiersza w każdym pliku, podczas gdy NRjest to liczba w całym danych wejściowych (nie jest to problem podczas instalacji).
Tomasz Gandor
3

Możesz także pominąć dowolną liczbę wierszy na początku lub na końcu pliku za pomocą headlub tailprogramów.

Na twoje konkretne pytanie

tail input.txt -n+7 | program.awk

zrobi, pod warunkiem, że Twój program.awkplik jest wykonywalny. W przeciwnym razie możesz użyć

tail input.txt -n+7 | awk -f program.awk

W ten sposób oszczędzasz porównanie dla każdej linii i nie musisz zmieniać logiki kodu AWK.

tail rozpocznie przesyłanie strumieniowe tekstu od siódmej linii, pomijając sześć pierwszych linii.

Wydajność nie będzie miała wielkiego znaczenia, szczególnie jeśli proces tekstowy jest prosty dzięki buforowaniu. Jednak w przypadku długich plików i wielokrotnego używania w środowisku chmurowym można zaoszczędzić pewien koszt.

Dr. Windows
źródło
Prawidłowo, ale z zasady należy unikać orurowania, gdy można to łatwo zrobić za pomocą jednego narzędzia. Pomyśl o ogromnym pliku tekstowym łączącym oba polecenia, aby usunąć kilka wierszy.
Philippos