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 fortfahren
other 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 nextfile
es sich um eine GNU-AWK-Erweiterung handelt oder ob es auch in anderen AWKs verfügbar ist. Die mawk
Manpage 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 BEGINFILE
Block wie den folgenden einfügen:
BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
... remainder of awk script here ...