eliminar el retorno de carro 0d del archivo .csv

eliminar el retorno de carro 0d del archivo .csv

Al trabajar con un script, tengo este problema. La mayoría de las veces, cuando ejecuto el script, este es el archivo de salida que tengo:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167224170, 148.000.000.30
 SEP0c1167231d2e, 148.000.000.194
 SEP0c1167233b9f, 148.000.000.31
 CUV, 148.000.000.254
 SEP0c1167231d32, 148.000.000.34
 SEP501cbffcfa9c, 148.000.000.24
 SEP00082fb67d5f, 148.000.000.21
 SEP00082fb67701, 148.000.000.22

Y esto es exactamente lo que esperaba, pero ocasionalmente el archivo se ve así:

device_id,ip_address,serial_number
 SEP0c1167231746
, 148.000.000.32
 SEP0c1167223fa5
, 148.000.000.30
 SEP0c1167224170
, 148.000.000.30
 SEP0c1167231d2e
, 148.000.000.194
 SEP0c1167233b9f
, 148.000.000.31
 CUV
, 148.000.000.254
 SEP0c1167231d32
, 148.000.000.34
 SEP501cbffcfa9c
, 148.000.000.24
 SEP00082fb67d5f
, 148.000.000.21
 SEP00082fb67701
, 148.000.000.22

Intenté averiguar qué está pasando, pero no parece ser algo regular, ahora solo quiero manejar esto, usando Ghex he identificado el personaje que causa el problema.

ingrese la descripción de la imagen aquí

Ahora me gustaría reemplazar todos los "0D" con Null y conservar todos los "0A".

Solo como nota, intenté usar "dos2unix" pero no funcionó.

¿Usted me podría ayudar?

ACTUALIZACIÓN: Usando: sed -n -e '/,/!{N;s/\n//;}; /,/p' entrada

con un archivo como este:

device_id,ip_address,serial_number
 SEP0c1167231746
, 148.000.000.32
,
 SEP0c1167223fa5
, 148.000.000.30
,
 SEP0c1167224170
, 148.000.000.30
,
 SEP0c1167231d2e
, 148.000.000.194
,
 SEP0c1167233b9f
, 148.000.000.31
,
 CUV
, 148.000.000.254
,
 SEP0c1167231d32
, 148.000.000.34
,
 SEP501cbffcfa9c
, 148.000.000.24
,
 SEP00082fb67d5f
, 148.000.000.21
,
 SEP00082fb67701
, 148.000.000.22

Tengo este resultado:

, 148.000.000.32
, 148.000.000.30
, 148.000.000.30
, 148.000.000.194
, 148.000.000.31
, 148.000.000.254
, 148.000.000.34
, 148.000.000.24
, 148.000.000.21
, 148.000.000.22

Respuesta1

Puede que haya una mejor sedopción, pero aquí tienes una:

sed -n -e '/,/!{N;s/\n//;}; /,/p' input > output

Dice (de forma predeterminada, no imprime líneas): si hay una coma en la línea, entonces lea lapróximoingrese y reemplace la nueva línea. Luego, si hay (ahora o ya) una coma en la línea, imprima la línea. Lee inputy escribe en output. Con algunos seds, puedes usar -iel indicador sed para editar el archivo en el lugar.

Entrada de muestra:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167231746
, 148.000.000.32
 SEP0c1167223fa5
, 148.000.000.30

Salida de muestra:

device_id,ip_address,serial_number
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30
 SEP0c1167231746, 148.000.000.32
 SEP0c1167223fa5, 148.000.000.30

Respuesta2

Mirando su volcado hexadecimal, parece que esto debería solucionar su problema:

tr -d '\015' < input > log

Como el octal \015es el carriage return ^Mpersonaje.

La razón por la que dos2unixno ayudó es porque dos2unixmira la secuencia \r\nque no está presente en su caso.

información relacionada