corte uma coluna da matriz e junte outra coluna a um arquivo csv

corte uma coluna da matriz e junte outra coluna a um arquivo csv

Eu tenho um arquivo CSV como

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

Eu precisava remover a coluna da matriz do arquivo CSV acima e obter a saída como

output.csv

1,2,3,9,12
1,2,3,9,12
1,2,3,9,12

Então eu tentei

cut -d , -f4 -- complement input.csv > output.csv

Mas o comando acima deu o erro

O delimitador deve ser um único caractere

Também quero juntar o output.csv com outro arquivo CSV

column.csv
30
36
90

Então o resultado ficaria assim

result.csv
1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

Alguém pode ajudar-me?

Responder1


com Miller (http://johnkerl.org/miller/doc) Começando de

1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12
1,2,3,"{1,2,3}",9,12

é muito simples e você pode executar

mlr --csv --implicit-csv-header --headerless-csv-output cut -x -f 4 input.csv | paste -d , - column.csv

obter

1,2,3,9,12,30
1,2,3,9,12,36
1,2,3,9,12,90

Com cut -x -f 4eu removo a quarta coluna e com pasteeu adiciono a coluna column.csv

Responder2

Para lidar adequadamente com delimitadores entre aspas, você deve considerar o uso de um analisador CSV projetado especificamente - por exemplo, aquele do módulo perl Text::CSV. Por exemplo,

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

Responder3

Se você não quiser usar o analisador CSV projetado especificamente, conforme sugerido por @steeldrive, você pode usar awk:

awk '{split($0,a,"\""); print a[1] substr(a[3],2)}' input.csv > output.csv

Esteja ciente de que isso só funcionará para o estilo fornecido no exemplo.

Explicação:

Divida o texto a cada"

{split($0,a,"\"")

Imprima e remova a primeira ,da segunda coluna

print a[1] substr(a[3],2)

informação relacionada