Ausschließen von eingeschlossenen Trennzeichen mit Schnitt

Ausschließen von eingeschlossenen Trennzeichen mit Schnitt

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 gawkv4 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 perlLö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 grepauch 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"

verwandte Informationen