Teilen einer CSV-Spalte ohne eindeutige Trennzeichen im Shell-Skript

Oct 07 2020

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

1 JamesBrown Oct 07 2020 at 13:12

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"
...
1 CarlosPascual Oct 07 2020 at 14:30

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.