![excluindo o retorno de carro 0d do arquivo .csv](https://rvso.com/image/109230/excluindo%20o%20retorno%20de%20carro%200d%20do%20arquivo%20.csv%20.png)
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.
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 sed
opçã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ê input
e grava em output
. Com alguns seds, você pode usar -i
o 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
^M
personagem.
Por que dos2unix
não ajudou é porque dos2unix
olha a sequência \r\n
que não está presente no seu caso.