Analysieren Sie die Datei mit Awk nur, wenn die erste Zeile dem Muster entspricht

Analysieren Sie die Datei mit Awk nur, wenn die erste Zeile dem Muster entspricht

Ich muss den Header einer CSV-Datei abfragen und, wenn eine Spalte vorhanden ist, mit den Datenzeilen fortfahren. Der Kontext ist, wenn die Daten Spalten enthalten, abhängig davon, wann und was sie ausgegeben hat.

Hoffe auf eine „reine“ Awk-Lösung, um die Geschäftslogik in einer gemeinsamen Sprache zu halten, bin aber, falls dies nicht möglich ist, an Ansätzen interessiert, die selektiv Dateien mit dem Header liefern, der mit dem Awk-Skript übereinstimmt.

Die Verwendung der neuesten Version von Gawk ist immer eine Option.

Bearbeiten, um Pseudocode hinzuzufügen:

wenn Spalte in Kopfzeile (NR==1): dann mit dem Rest der Datei fortfahren, sonst Dateiverarbeitung beenden

Antwort1

um Dateien aufzulisten:

versuchen

awk 'FNR == 1 && $4 == "whatever" { print FILENAME ;}' file1 ... filen |

Dadurch werden alle Dateien ausgewählt, deren vierte Spalte einen beliebigen Inhalt enthält.

Wenn Sie einen lustigen Namen haben, fügen Sie einfach Anführungszeichen hinzu.

awk 'FNR == 1 && $4 == "whatever" { printf "\"s\"\n", FILENAME ;}' file1 ... filen |

eine Datei verarbeiten

awk 'NR == 1 && $4 != "whatever" { exit ;}  other patterns { other action;}' file

zur Verarbeitung vieler Dateien

awk 'NR == 1 && $4 != "whatever" { nextfile ;}  other patterns { other action;}' file1 ... filen

was man lesen könnte als

  • WENN (Bedingung nicht erfüllt)NR == 1 && $4 != "whatever"
  • DANN überspringen Sie diese Datei{ nextfile ;}
  • SONST fortfahrenother patterns { other action;}

Antwort2

Ausgehend von einer einfachen, durch Kommas getrennten Datei, in der jedes Komma ein Trennzeichen ist (einige CSV-Dateien enthalten möglicherweise Kommas in Anführungszeichen, die nicht als Feldtrennzeichen behandelt werden sollten), werden im Folgenden alle Zeilen außer der Kopfzeile gedruckt, wenn eine Spalte in der Kopfzeile „SOMESTRING“ ist:

awk -F, '
    FNR==1 {
        for (i=1; i<=NF; i++) 
            if ($i == "SOMESTRING")
                next
        nextfile
    }
    1
' file1 file2 file3 file4

Der Zeichenfolgenvergleich kann bei Bedarf durch einen Teilzeichenfolgentest oder eine Übereinstimmungsoperation mit regulären Ausdrücken ersetzt werden.

nextfile ist nicht Teil von POSIX AWK, aber weit verbreitet; es ist zumindest in gawk, nawk (verwendet auf *BSD-Systemen), mawk und busybox verfügbar.

Antwort3

awk 'FNR==1 && ! /whatever/ { nextfile } ; ...remainder of awk script here...' list_of_files_to_process

Dadurch sollte zur nächsten zu verarbeitenden Datei gesprungen werden, sofern in Zeile 1 nicht „was auch immer“ steht.

Ich kann mich nicht erinnern, ob nextfilees sich um eine GNU-AWK-Erweiterung handelt oder ob es auch in anderen AWKs verfügbar ist. Die mawkManpage erwähnt es nicht, aber es wird in der Manpage für erwähnt original-awk. Wenn es für Sie wichtig ist, prüfen Sie es, bevor Sie sich auf die Funktion verlassen.

Wenn Sie GNU awk verwenden, möchten Sie diesen Test möglicherweise in einen BEGINFILEBlock wie den folgenden einfügen:

 BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
 ... remainder of awk script here ...

verwandte Informationen