reemplazar espacio y celdas vacías en el archivo csv

0

Tengo un archivo csv que tiene 7 columnas. Tiene celdas vacías y algunos espacios entre celdas. ¿Cómo puedo reemplazar las celdas vacías con NA y eliminar espacios adicionales? ¡Muchas gracias!

Así es como se ve mi archivo, pero aquí parece deformarse cuando lo copio y lo pego.

130070078,PPW0001,1,4,4HW             ,2,15.61943874
120040039,PPW0002,0,0,                ,0,0
120040043,PPW0003,1,3,3WE             ,1,14.43394935
Elham
fuente
Por favor, tenga cuidado: si el archivo CSV contiene espacios y comas (por ejemplo foo,"bar, baz",bar- que tiene dos celdas: foo, bar, bazy bar) no es fácil de analizar (y modificar) con sedo awk.
uzsolt
Gracias. basado en el comentario anterior de @Cyrus (que ahora parece haberse eliminado). Hice esto seguido de reemplazar el espacio vacío con NA y funcionó: sed 's / *, /, / g' file1 | sed 's / ,, /, NA, / g'> archivo2
Elham
@ uzsolt2, ¿cómo puedo saber si mi archivo tiene este problema y cómo lo resuelvo? Porque creo que uno de mis otros archivos tiene este problema, así que cuando uso awk para imprimir una columna (la última en el archivo), devuelve una columna vacía.
Elham
Si el recuento de comas es mayor que su número de columnas. O ... muchos casos. La otra pregunta (cómo resolver): estoy usando "psv", "valores separados por tuberías", el carácter separador es "|". Raramente se usa carácter en textos o números :)
uzsolt

Respuestas:

1

Usar sedeso también funcionará para campos vacíos repetidos:

sed ':l;s/,,/,NA,/;tl; s/[[:blank:]]*//g'

O usando awk:

awk '{i=0;while(i++<2){gsub(/,,/,",na,");gsub(/ /, "")}}1'

Entrada:

130070078,PPW0001,1,4,4HW         ,2,15.61943874
120040039,PPW0002,0,0,            ,0,0
120040043,PPW0003,1,3, 3WE       ,1,14.43394935
120040043,PPW0003,1 ,3,3WE         ,1,14.43,,,3,,94,,,,9,,,,,35
120040043,PPW0003,0, 2, 3WE       ,1,14.43,,,3,,94,,,,9,,,,,35

Salida:

130070078,PPW0001,1,4,4HW,2,15.61943874
120040039,PPW0002,0,0,,0,0
120040043,PPW0003,1,3,3WE,1,14.43394935
120040043,PPW0003,1,3,3WE,1,14.43,NA,NA,3,NA,94,NA,NA,NA,9,NA,NA,NA,NA,35
120040043,PPW0003,0,2,3WE,1,14.43,NA,NA,3,NA,94,NA,NA,NA,9,NA,NA,NA,NA,35
αғsнιη
fuente
0

Tu respuesta:

sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' > file2

Para obtener 'NA' en el último campo si está en blanco:

sed 's/ *,/,/g' file1 | sed 's/,,/,NA,/g' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'> file2

También puedes usar:

sed 's/,,/,NA,/g' file1 | tr -d ' ' | awk -F, 'OFS="," {if ($NF == "") $NF = "NA"; print}'
bstipe
fuente
0

La respuesta de αғsнιη funcionó para mí, pero me gustaría explicarlo un poco.

Estaba intentando algo como esto:

echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed 's/,,/,-,/g'

Que salidas

1,-,2,-,,3,-,,4,-,,-,5,-,,-,,-,,-,,-,6

Debido a los campos vacíos repetidos, la última coma es parte del primer reemplazo y el comienzo del siguiente reemplazo deseado, por lo que solo se reemplaza cada segundo campo vacío.

Ahora podrías hacer algo como:

echo "1,,2,,,3,,,4,,,,5,,,,,,,,,,6" | sed -e 's/,,/,-,/g' -e 's/,,/,-,/g'

o

sed 's/,,/,-,/g;s/,,/,-,/g'

Lo que reemplazará todas las celdas, ya que el segundo comando obtendrá las que se pierden, pero es un poco desordenado.

El comando de αғsнιη hace esencialmente lo mismo, usando una etiqueta y un salto, que no sabía que pudieras hacer.

sed ':MYLABEL; s/,,/,-,/g; t MYLABEL;'

salida:

1,-,2,-,-,3,-,-,4,-,-,-,5,-,-,-,-,-,-,-,-,-,6

Entonces, la primera parte del comando crea una etiqueta.

Entonces tenemos la misma sustitución.

Luego tenemos el comando t que significa saltar a la etiqueta si el comando de sustitución anterior fue exitoso.

Más información: http://www.grymoire.com/Unix/Sed.html#uh-59

Jack Culhane
fuente