Como manipular ^ M em arquivos csv usando sed & awk?

3

Eu tenho um arquivo com delimitador ~ e não consegui carregar no banco de dados:

Arquivo de entrada:

24~1~2~2~unsubscribed~wap~7~2015-10-23 20:03:00~2015-10-24 20:04:00~2015-10-25 02:53:26~Testing duplicate msisdn campaing row rount 29 ^M\
total - 58~58

Resultado esperado:

24~1~2~2~unsubscribed~wap~7~2015-10-23 20:03:00~2015-10-24 20:04:00~2015-10-25 02:53:26~Testing duplicate msisdn campaing row rount 29 total - 58~58

Se você notar no arquivo de entrada tem ( ^M\ ). Eu quero substituir esse valor por um espaço. Eu tentei com sed (sed 's / ^ M \ // g' filename). Eu não estava ficando como esperado. A pesquisa por ^M em vi também me fornece 'padrão não encontrado'.

    
por Harkirat Singh 26.10.2015 / 18:27

3 respostas

4

Em primeiro lugar, que ^M é um retorno de carro ( \r ), não uma nova linha (% código%). O \n é outra coisa novamente, ele está lá para escapar da nova linha, assim os programas de análise de CSS não o tratarão como o fim do registro.

O que você realmente tem lá é um arquivo que foi criado no Windows, onde o final de uma linha é definido por \ em oposição a apenas \r\n como você tem em * nix. Não posso ter certeza se você não nos der um trecho do seu arquivo real, mas se vir \n in ^M\ , seguido de vim e, em seguida, uma nova linha, você provavelmente terá \ no arquivo. Então, tente isto:

perl -i -pe 's/\r\\n/ /'g file
    
por 26.10.2015 / 18:41
1

Há um retorno de carro antes da nova linha.
Você pode s,.$,, in vim remover o último caractere em qualquer linha.
Ou você pode s,^M$,, . Para obter o caracter real "^ M" e não uma expressão regular da sequência ^,M,$ , pressione Ctrl V e pressione Ctrl M .

    
por 27.10.2015 / 14:45
-1
 sed 's/\^M\//g' filename

Escapando meta personagem.

    
por 27.10.2015 / 04:01