Überspringen Sie die ersten 6 Zeilen in einer Textdatei mit awk

39

Wie kann ich die ersten 6 Zeilen in einer Textdatei (input.txt) überspringen und den Rest mit awk verarbeiten? Das Format meines awk-Skripts (program.awk) lautet:

BEGIN {
} 

{ 
process here
} 

END {

}

Meine Textdatei sieht folgendermaßen aus:

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

Ich möchte die Datei verarbeiten, beginnend mit:

0.3 3.3
1.5 2.1
.
.
.
amatek
quelle

Antworten:

59

Verwenden Sie eines der beiden Muster:

NR>6 { this_code_is_active }

oder dieses:

NR<=6 { next }
{ this_code_is_active }

Verwenden Sie FNR anstelle von NR, wenn Sie viele Dateien als Argumente für awk haben und in jeder Datei 6 Zeilen überspringen möchten.

Janis
quelle
29

Versuchen:

awk 'FNR > 6 { #process here }' file
cuonglm
quelle
4
Gut! Aber Sie haben nicht erklärt, warum dies besser ist - für mehrere Dateien FNRist die Zeilennummer in jeder Datei, während NRdie Nummer in der gesamten Eingabe ist (kein Problem beim Piping).
Tomasz Gandor
3

Sie können mit headoder tailprograms auch eine beliebige Anzahl von Zeilen am Anfang oder Ende der Datei überspringen .

Für Ihre konkrete Frage,

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

wird tun, sofern Ihre program.awkDatei ausführbar ist. Andernfalls können Sie verwenden

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

Auf diese Weise ersparen Sie sich einen Vergleich für jede Zeile und müssen die Logik Ihres AWK-Codes nicht ändern.

tail Der Text wird ab der siebten Zeile gestreamt, wobei die ersten sechs Zeilen übersprungen werden.

Dies wird keine große Leistungseinbuße sein, insbesondere wenn die Textverarbeitung dank Caching einfach ist. Bei langen Dateien und wiederholter Verwendung in einer Cloud-Umgebung können jedoch einige Kosten gespart werden.

Dr. Windows
quelle
Richtig, aber als Faustregel sollte man Rohrleitungen vermeiden, wenn man es einfach mit einem Werkzeug alleine machen kann. Stellen Sie sich eine große Textdatei vor, die beide Befehle durchläuft, um nur einige Zeilen zu entfernen.
Philippos