Testen Sie alle Zeilen in einer Datei mit awk und grep und fügen Sie sie bei Übereinstimmung in eine andere Datei ein.

Testen Sie alle Zeilen in einer Datei mit awk und grep und fügen Sie sie bei Übereinstimmung in eine andere Datei ein.

Hier ist meine Dateitest.csv

bonjour|b|french;deutsch|french
hello|h|english;russian|french
gutentag|g|german;polish|french
ciao|i|italian|french

Ich möchte testen, ob die dritte durch | getrennte Zeile französisch ist (Französisch kann in einer anderen Teilung vorkommen, also nur in der dritten) und alle Zeilen, die dazu passen, in eine andere Datei einfügen.

Beispiel :

bonjour|b|french;deutsch|french

french;deutschPass Es an

Etwas wieawk -F | '$3=="french"' file

Antwort1

awk -F '[|;]' '$3 == "french"' file >newfile

Dabei werden sowohl als Feldtrennzeichen |als auch ;als Feldtrennzeichen verwendet und ein Zeichenfolgenvergleich zwischen dem dritten Feld und der Zeichenfolge durchgeführt french. Wenn die Zeichenfolge übereinstimmt, wird die Zeile ausgegeben. Alle Ausgaben werden in die Datei umgeleitet newfile.

Bei Verwendungnur |als Trennzeichen müsstest du mit einem regulären Ausdruck auf den Anfang des dritten Feldes testen:

awk -F '|' '$3 ~ /^french;/' file >newfile

Dieser erkennt die Zeichenfolge french;am Anfang des dritten Felds und gibt bei Übereinstimmung die Zeile aus.

Wenn frenchkann überall im dritten |-getrennten Feld auftreten (z. B. als dutch;french), dann möchten Sie dieses Muster vielleicht etwas lockern und verwenden

awk -F '|' '$3 ~ /french/' file >newfile

grepwäre hier etwas umständlich zu verwenden, da es schwieriger ist, genau anzugeben, welches durch |-getrennte Feld abgeglichen werden soll:

grep '^\([[:alpha:]]\{1,\}|\)\{2\}french;' file >newfile

Dies entspricht einer Zeichenfolge aus alphabetischen Zeichen (Buchstaben), gefolgt von einem |Zeichen, zweimal und dann der Zeichenfolge french;.

Mit einem erweiterten regulären Ausdruck:

grep -E '^([[:alpha:]]+\|){2}french;' file >newfile

Beachten Sie, dass das |„Jetzt“ maskiert werden muss, damit es nicht als Alternative interpretiert wird.

Auch hier gilt: Wenn french„kann“ irgendwo im dritten Feld vorkommen, müssen Sie den Ausdruck etwas lockern:

grep '^\([[:alpha:]]\{1,\}|\)\{2\}[^|]*french' file >newfile

oder,

grep -E '^([[:alpha:]]+\|){2}[^|]*french' file >newfile

Ich habe eingefügt , was mit jeder Reihe von Nicht- Zeichen vor dem Wort [^|]*übereinstimmt (beispielsweise der Zeichenfolge ), und ich habe das am Ende des Wortes entfernt (oder Sie hätten das durch ersetzen können ).|frenchdutch;;;[;|]

verwandte Informationen