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.
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 sed
opció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 input
y escribe en output
. Con algunos seds, puedes usar -i
el 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 \015
es el carriage return
^M
personaje.
La razón por la que dos2unix
no ayudó es porque dos2unix
mira la secuencia \r\n
que no está presente en su caso.