Reemplazar el guión bajo por comas y eliminar las comillas dobles en CSV


10

Tengo un archivo CSV como

input.csv

"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"

............. y así.

Necesito convertir este archivo CSV en

result.csv 

1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85

Respuestas:


24

Una forma mucho más simple es usar tr

$ tr '_' ',' < input.csv | tr -d '"'                  
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

La forma en que esto funciona es que trrequiere dos argumentos: un conjunto de caracteres para ser reemplazados y su reemplazo. En este caso solo tenemos conjuntos de 1 carácter. Redirigimos input.csvde entrada tr's flujo de entrada estándar a través de <operador de concha, y canalizar la salida resultante para tr -d '"'eliminar las comillas dobles.

Pero también awkpuede hacerlo.

$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

La forma en que esto funciona es ligeramente diferente: awk lee cada archivo línea por línea, siendo cada secuencia de comandos en línea /Pattern match/{ codeblock}/Another pattern/{code block for this pattern}. Aquí no tenemos un patrón, por lo que significa ejecutar codeblock para cada línea. gsub()La función se usa para la sustitución global dentro de una línea, por lo tanto, la usamos para reemplazar guiones bajos por comas y comillas dobles con una cadena nula (eliminando efectivamente el carácter). El 1está en lugar de la coincidencia de patrón con el bloque de código que falta, que por defecto simplemente imprime la línea; en otras palabras, el bloque de código gsub()hace el trabajo e 1imprime el resultado.

Use la redirección de shell ( >) para enviar la salida a un nuevo archivo:

 awk '{gsub(/_/,",");gsub(/\"/,"")};1' input.csv > output.csv

Disculpas. También quería eliminar las comillas invertidas. Actualicé la pregunta
RKR

@RKR Respuesta actualizada en consecuencia, la respuesta de Ian también se actualiza
Sergiy Kolodyazhnyy

13

Como alternativa, también puede usar este sedcomando:

$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78

1
Dentro de las comillas simples, no necesita escapar de una comilla doble.
Glenn Jackman

De hecho @glennjackman! Acabo de quitar la barra invertida de escape
IanC

10

Perl, la "motosierra del ejército suizo" del procesamiento de texto en línea de comandos, también puede hacer esto. La sintaxis es (no casualmente) bastante similar a la try sedejemplos:

perl -pe 'tr/_"/,/d' input.csv > result.csv

o:

perl -pe 's/_/,/g; s/"//g' input.csv > result.csv

Pero, sinceramente, si no desea tomarse el tiempo para aprender un nuevo lenguaje de programación (que es realmente lo que hacen awk, Perl y sed y otras herramientas como estas) solo para esta tarea básica, también podría hacerlo en cualquier editor de texto que admita búsqueda y reemplazo:

  1. Abra el archivo CSV en su editor de texto favorito (como gedit, kate, mousepad, etc.; incluso el Bloc de notas o Wordpad simple en Windows puede hacer esto).

  2. Seleccione "Buscar y reemplazar" en el menú (normalmente se encuentra en "Editar", si no hay un menú "Buscar" por separado).

  3. Ingrese _en el cuadro de búsqueda y ,en el cuadro de reemplazo.

  4. Haga clic en "Reemplazar todo".

  5. Repita con "en el cuadro de búsqueda y nada en el cuadro de reemplazo.

  6. Guarda el archivo.

Ahora, si necesita hacer esto para 100 o 1000 archivos en lugar de solo uno, entonces aprender una nueva herramienta de línea de comandos comienza a tener sentido. Y, por supuesto, una vez que sepa cómo usar Perl o sed o lo que sea, entonces ahorrará mucho tiempo y esfuerzo con tareas similares más adelante. Pero para un trabajo único que no espera volver a hacer, a veces una herramienta interactiva básica como un editor de texto es la solución más simple.


3

Podrías hacer esto vimtambién.

Abra el archivo:, vim input.csvluego use vimla herramienta de búsqueda avanzada s. Escribe dos puntos ( :) para entrar en modo comando y ejecuta comandos como este:

:%s's/_/,/g'  -- Replaces all occurrences of _ with , in the current file.
:s/\"//g -- Replaces all occurrences of " with nothing in the current file.

Prácticamente los mismos comandos que en la respuesta de IanC, pero dentro de en vimlugar de usar sed.


2

¿Por qué no simplemente cambiar los valores predeterminados de los valores del separador de entrada y salida?

awk -F "_" 'BEGIN { OFS="," }; {gsub(/\"/,""); print $1,$2,$3,$4,$5}' input.csv
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.