
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 4
elimino la cuarta columna y con paste
agrego 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)