Obtendo Source como Flatfile e removendo o Carriage returns e \ n… charaters especiais?

3

Eu tenho um problema em obter uma fonte flatfile com um grande número de registros com delimitadores PIPE e um dos campos está recebendo retornos de carro (em várias linhas) e começa com uma nova linha ( \n ). Então, como posso remover o caractere \n no arquivo?

Exemplo:

-000123456|1654321|6/12/2002 8:49:20 AM|
tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|

Alguém pode sugerir como proceder?

    
por Bharath 26.11.2012 / 09:44

3 respostas

2

Se você sabe que este campo começa com \n em todos os registros, você pode usar sed da seguinte forma:

sed "N;s/|\n/|/"

para se livrar da nova linha. Observe que, como sed usa \n como delimitadores de linha, você primeiro precisa unir a linha seguinte à processada (o comando N ), durante esse processo sed insere o caractere de nova linha entre as linhas unidas.

Se este problema surgir aleatoriamente (não em todos os registros), você terá que recorrer a uma ferramenta mais strong para analisar o conteúdo do arquivo - basicamente, você precisa contar os campos. O awk ou perl pode fazer o truque elegantemente (acho que isso pode ser feito em sed bem como o, mas você provavelmente não quer ir nessa direção ).

    
por 26.11.2012 / 13:42
0
awk 1 ORS=

Resultado

-000123456|1654321|6/12/2002 8:49:20 AM|tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|
    
por 04.06.2014 / 06:59
-2

Você pode usar muitas ferramentas, mas o sed foi criado exatamente para esse tipo de situação:

 sed -i 's,\n,,g' Flatfile

Para mostrar como funciona, aqui está a mesma expressão com a entrada que você forneceu, apenas ecoada:

$ echo '-000123456|1654321|6/12/2002 8:49:20 AM|\n tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|' | sed 's,\n,,g'
-000123456|1654321|6/12/2002 8:49:20 AM| tt Cynthia L Eggleston E456585 remove move the funds adv account in fcle flagged on 710091 pmt due 12-16- 15|

Ele apenas procura a string \n e a substitui por uma string vazia de comprimento zero (removendo-a efetivamente). Há dois \ , então \n perde seu significado especial (caractere de nova linha) e pode ser correspondido como dois caracteres.

    
por 26.11.2012 / 13:33