
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 4
eu removo a quarta coluna e com paste
eu 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)