
Ich habe eine CSV-Datei als
input.csv
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
Ich musste die Array-Spalte aus der obigen CSV-Datei entfernen und die Ausgabe als
output.csv
1,2,3,9,12
1,2,3,9,12
1,2,3,9,12
Also habe ich versucht
cut -d , -f4 -- complement input.csv > output.csv
Aber der obige Befehl gab den Fehler
Das Trennzeichen muss ein einzelnes Zeichen sein
Ich möchte die Datei output.csv auch mit einer anderen CSV-Datei verknüpfen
column.csv
30
36
90
Dann würde das Ergebnis so aussehen
result.csv
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
Kann mir jemand helfen?
Antwort1
mit Miller (http://johnkerl.org/miller/doc) ab
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
ist sehr einfach und Sie können
mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv | paste -d , - column.csv
erhalten
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
Mit cut -x -f 4
entferne ich die vierte Spalte und mit paste
füge ich die Spalte column.csv hinzu
Antwort2
Um Anführungszeichen richtig zu verarbeiten, sollten Sie einen speziell dafür entwickelten CSV-Parser verwenden - zum Beispiel den aus dem Perl-Modul Text::CSV. Zum Beispiel:
paste -d, input.csv column.csv | perl -MText::CSV -ne '
BEGIN {$csv = Text::CSV->new()}
if ($csv->parse($_)) {
@a = $csv->fields();
splice(@a, 3, 1);
print join(",", @a) . "\n";
}'
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90
Antwort3
Wenn Sie nicht den speziell entwickelten CSV-Parser verwenden möchten, wie von @steeldrive vorgeschlagen, können Sie Folgendes verwenden awk
:
awk '{split($0,a,"\""); print a[1] substr(a[3],2)}' input.csv > output.csv
Beachten Sie, dass dies nur für den im Beispiel angegebenen Stil funktioniert.
Erläuterung:
Teilen Sie den Text alle"
{split($0,a,"\"")
Drucken und entfernen Sie die erste ,
der zweiten Spalte
print a[1] substr(a[3],2)