Schneiden Sie eine Array-Spalte aus und fügen Sie eine weitere Spalte zu einer CSV-Datei hinzu

Schneiden Sie eine Array-Spalte aus und fügen Sie eine weitere Spalte zu einer CSV-Datei hinzu

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 4entferne ich die vierte Spalte und mit pastefü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)

verwandte Informationen