Nehmen wir an, ich habe eine CSV-Datei:
"col1","col2","col3"
"col4","col5,subtext","col6
Das Problem, das ich habe, ist folgendes:
cut -d, -f1,2 test.txt
"coll1","col2"
"col4","col5
Die gewünschte Ausgabe ist:
"col1","col2"
"col4","col5,subtext"
Antwort1
Das ParseWords-Modul, das mit Perl mitgeliefert wird, deckt dies recht elegant ab. Beispiel unten.
$ perl -MText::ParseWords -nE '@a=quotewords ",",1,$_;say $a[0],",",$a[1]' <test.txt
"col1","col2"
"col4","col5,subtext"
$
Antwort2
Wenn Sie gawk
v4 zur Verfügung haben, gibt es eine gute Lösung unterAnalysieren Sie eine CSV-Datei mit awk und ignorieren Sie Kommas innerhalb eines Felds
Beispiel:
gawk -vFPAT='[^,]*|"[^"]*"' '{print $1 "," $2}' test.txt
Antwort3
Eine andere perl
Lösung, vorausgesetzt, alle Felder sind in Anführungszeichen
$ perl -F'/"\K,(?=")/' -lane 'print "$F[0],$F[1]"' test.txt
"col1","col2"
"col4","col5,subtext"
-F'/"\K,(?=")/'
Das Komma ist nur dann das Feldtrennzeichen, wenn davor"
und danach"
print "$F[0],$F[1]"
Drucken Sie die ersten beiden Felder getrennt durch,
Kann grep
auch mit gemacht werden
$ grep -oE '^"[^"]*","[^"]*"' test.txt
"col1","col2"
"col4","col5,subtext"
Wenn N Felder benötigt werden, verwenden Sie, grep -oE '^("[^"]*",){1}"[^"]*"'
wobei die Zahl darin {}
istN-1
Antwort4
Sie können dies auch mit awk wie unten versuchen;
awk -F'","' '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt
Z.B;
user@host$ awk -F'","' '{printf "%s\",\"%s\"\n", $1, $2 }' test.txt
"col1","col2"
"col4","col5,subtext"