excluindo o retorno de carro 0d do arquivo .csv

excluindo o retorno de carro 0d do arquivo .csv

trabalhando com um script, tenho esse problema. Na maioria das vezes, quando executo o script, este é o arquivo de saída que tenho:

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

E é exatamente isso que eu esperava, mas ocasionalmente o arquivo fica assim:

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

Tentei descobrir o que está acontecendo, mas não parece ser algo normal, agora só quero resolver isso, usando Ghex identifiquei o personagem que causa o problema.

insira a descrição da imagem aqui

Agora eu gostaria de substituir todos os "0D" por Nulos e manter todos os "0A"

apenas como observação, tentei usar "dos2unix", mas não funcionou.

Você poderia me ajudar?

ATUALIZAÇÃO: Usando: sed -n -e '/,/!{N;s/\n//;}; /,/p'entrada

com um arquivo 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

Eu tenho esta saída:

, 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

Responder1

Pode haver uma sedopção melhor, mas aqui está uma:

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

Diz (por padrão, sem imprimir linhas): se houver uma vírgula na linha, leia opróximoentre e substitua a nova linha. Então, se houver (agora ou já) uma vírgula na linha, imprima a linha. Ele lê inpute grava em output. Com alguns seds, você pode usar -io sinalizador do sed para editar o arquivo no local.

Exemplo de entrada:

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

Exemplo de saída:

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

Responder2

Olhando para o seu hexdump, parece que isso deve resolver o seu problema:

tr -d '\015' < input > log

Como o octal \015é o carriage return ^Mpersonagem.

Por que dos2unixnão ajudou é porque dos2unixolha a sequência \r\nque não está presente no seu caso.

informação relacionada