Ich habe eine Datei im folgenden Format:
field1|field2|field3
field1|"field2|field2"|field3
Beachten Sie, dass die zweite Zeile doppelte Anführungszeichen enthält. Die Zeichenfolge in doppelten Anführungszeichen gehört zu Feld 2. Wie wird dies mit awk extrahiert? Ich habe ohne Ergebnisse gegoogelt. Ich habe es auch ohne Glück versucht
FS='"| "|^"|"$' '{print $2}'
Antworten:
Wenn Sie eine aktuelle Version von haben, haben
gawk
Sie Glück. Es gibt die hierFPAT
dokumentierte Funktionquelle
FPAT = "([^|]*)|(\"[^\"]+\")"
, um leere Felder zu behandeln, wie||
FPAT = "([^,]*)|(\"([^\"]|\"\")*\")"
. Für das obige mit Rohrbegrenzer wäre esFPAT = "([^|]*)|(\"([^\"]|\"\")*\")"
.Dies ist etwas, in das Sie einsteigen
csv
- wenn das Trennzeichen Teil des Feldes ist, wird es in Anführungszeichen gesetzt. Das macht es plötzlich VIEL schwieriger, es zu analysieren, weil man sich nicht einfach auf ein Delim aufteilen kann.Glücklicherweise haben Sie, wenn dies
perl
eine Option ist, dasText::CSV
Modul, das diesen Fall behandelt:Könnte dies wahrscheinlich zu einem Inline / Pipeable verdichten, wenn Sie es vorziehen - so etwas wie:
quelle
Möglicherweise möchten Sie diese Daten
sed
so formatieren, dass sie leichter analysiert werdenawk
können. zum Beispiel:Andererseits kenne ich die Art der Daten, mit denen Sie arbeiten, nicht.
quelle
field2|field2
als einzelnes Feld in der zweiten Zeile zu haben.