cortar una columna de matriz y unir otra columna a un archivo csv

cortar una columna de matriz y unir otra columna a un archivo csv

Tengo un archivo 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

Necesitaba eliminar la columna de matriz del archivo CSV anterior y obtener el resultado como

output.csv

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

Así que lo intenté

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

Pero el comando anterior dio el error.

El delimitador debe ser un solo carácter.

También quiero unir el archivo output.csv con otro archivo CSV.

column.csv
30
36
90

Entonces el resultado sería así

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

¿Alguien podría ayudarme?

Respuesta1


con molinero (http://johnkerl.org/miller/doc) empezando desde

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

es muy simple y puedes ejecutar

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

para obtener

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

Con cut -x -f 4elimino la cuarta columna y con pasteagrego la columna column.csv

Respuesta2

Para manejar adecuadamente los delimitadores entre comillas, debería considerar el uso de un analizador CSV diseñado específicamente, por ejemplo, el del módulo Perl Text::CSV. Por ejemplo,

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

Respuesta3

Si no desea utilizar un analizador CSV diseñado específicamente como lo sugiere @steeldrive, puede usar awk:

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

Tenga en cuenta que esto sólo funcionará para el estilo proporcionado en el ejemplo.

Explicación:

Dividir el texto cada"

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

Imprime y elimina el primero ,de la segunda columna.

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

información relacionada