So wenden Sie den Awk-Befehl auf alle Felder außer einigen bestimmten Zeilen an

So wenden Sie den Awk-Befehl auf alle Felder außer einigen bestimmten Zeilen an

Ich habe eine Datei, in der jede 156780. Zeile eine Kopfzeile hat.

Ich wollte den awk-Befehl auf die erste Spalte jeder Zeile anwenden, außer auf die zweite Spalte der Kopfzeilen.

Oder zumindest die Kopfzeilen sollten davon unberührt bleiben.

Kann mir jemand dabei helfen?

Ich habe den awk-Befehl wie unten angegeben verwendet

awk 'NR>2 {printf("%10i %15.8E\n",$1,$2);}' fort.74 > fort.75

Antwort1

Die Kopfzeilen erfüllen die Bedingung NR % 156780 == 0. Das bedeutet, dass Sie

awk 'NR % 156780 != 0 { process non-header row }' ...

... oder möglicherweise

awk '(NR - 1) % 156780 != 0 { process non-header row }' ...

(da NRfür die erste Zeile 1 gilt, nicht null)

Wenn Sie die Kopfzeilen unverändert durchlassen möchten:

awk '(NR - 1) % 156780 != 0 { process non-header row } (NR - 1) % 156780 == 0 { print }' ...

Das heißt, fügen Sie einfach eine einzelne printAktion für die inverse Bedingung der Aktion hinzu, die Sie für die Einwirkung auf die Nicht-Kopfzeilen verwenden.

Antwort2

wie wäre es mit dem Einfachen:

awk '(NR==1)          { header=$0; rem="we retrieve the header content";}
     ( $0 != header ) { process non header lines here ... }'

(Sie können optional ein „; next“ in die erste Zeile einfügen, andernfalls können Sie es aber auch an einer kleinen Datei testen, zum Beispiel an einer mit den ersten fünf Zeilen der Originaldatei: Die zweite Zeile sollte die Zeile nicht verarbeiten, wenn sie mit dem Header übereinstimmt.)

verwandte Informationen