Teilen einer CSV-Spalte ohne eindeutige Trennzeichen im Shell-Skript
Ich habe eine CSV mit mehreren Zeilen, von denen einige so aussehen
"ABC","Unfortunately, system has failed"," - Error in system"
"DEF","Check the button labelled "WARNING"","Warning in system"
"XYZ","Everything is okay","No errors"
Ich muss diese Zeilen teilen und die Spalten wie z
Ich führe eine Schleife für jede der Zeilen aus und extrahiere die 2. Spalte als
awk -F , '{print $2}' $line
wo $linerepräsentiert jede Zeile. Am Ende bekomme ich jedoch falsche Werte. Wenn ich zum Beispiel versuche, die zweite Spalte der ersten Zeile abzurufen, gibt mir die Verwendung des obigen Befehls "Unfortunatelyund nicht"Unfortunately, system has failed"
Ich verstehe, dass meine Zeichenfolgen sowohl Kommas als auch Anführungszeichen enthalten, was es schwieriger macht, sie anhand eines Trennzeichens zu teilen. Kann ich noch etwas ausprobieren?
Antworten
Verwenden von GNU awk und FPAT:
$ gawk ' BEGIN { FPAT="([^,]*)|(\"[^\"]+\")" } { print $2
}' file
Ausgabe:
"Unfortunately, system has failed"
"Check the button labelled "WARNING""
"Everything is okay"
Es ist kein vollständiger CSV-Parser, zum Beispiel werden Zeilenumbrüche in Anführungszeichen nicht behandelt. Sie müssen sie selbst bearbeiten ( NFDatensätze prüfen und kombinieren). Mehr zu FPAT:
https://www.gnu.org/software/gawk/manual/html_node/Splitting-By-Content.html
Wenn Sie diese Zitate loswerden möchten:
$ gawk ' BEGIN { FPAT="([^,]+)|(\"[^\"]+\")" } { for(i=1;i<=NF;i++) # loop all fields gsub(/^"|"$/,"",$i) # remove quotes surrounding fields print $2
}' file
Ausgabebeispiel:
...
Check the button labelled "WARNING"
...
Wenn Sie Ihre Eingabedaten in eine 3x3-Tabelle einfügen möchten, können Sie dies tun mit awk:
awk -v FS=',[^ ]' -v OFS="|" '{print $1, $2, $3}' file
ABC"|Unfortunately, system has failed"| - Error in system"
"DEF"|Check the button labelled "WARNING""|Warning in system"
"XYZ"|Everything is okay"|No errors"
der Code:
- Warum einstellen
FS=',[^ ]'? Nur dieses Komma, systemist kein Trennzeichen.