Ordem de texto atrapalhada ao imprimir

1

Executamos um processo automatizado que altera a estrutura de dados em um arquivo, e ele é executado há cerca de um ano sem nenhum problema. Ele apenas começou a falhar e reduzi o problema a um dos campos de data no arquivo. Os arquivos antes e depois do problema começaram a parecer idênticos, mas há algo acontecendo. Se eu tentar imprimir o arquivo na tela com outro texto, ele embaralha o pedido. Não consigo encontrar nenhum caractere oculto no arquivo, embora eu suspeite que deve haver um. Alguém já viu isso antes?

Aqui está um exemplo. Eu aparoi tudo fora do arquivo, além dos campos desonestos e comparei um arquivo antigo com um novo:

$ cat old.file
16-JUN-2015
15-JUN-2015
$ cat old.file | awk '{print "a" $1 "b"}'
a16-JUN-2015b
a15-JUN-2015b
$ for line in 'cat old.file';do echo "a${line}b";done
a16-JUN-2015b
a15-JUN-2015b
$
$
$ cat new.file
23-JUN-2015
16-JUN-2015
$ cat new.file | awk '{print "a" $1 "b"}'
b23-JUN-2015
b16-JUN-2015
$ for line in 'cat new.file';do echo "a${line}b";done
b23-JUN-2015
b16-JUN-2015

Estou correndo com o Red Hat EL Server. Obrigado,

    
por Geraint 25.06.2015 / 11:58

3 respostas

1

Você de alguma forma conseguiu finais de linha no estilo do Windows, ou seja, CRLF \x0D\xOA \r\n ...

printf 'xyz\r\n' >file; cat file | awk '{print "a" $1 "b"}'

saídas de bxyz

cat file | sed -n l 

outputs xyz\r$ - O $ inidata o final da linha

Você pode filtrar qualquer \r s extrangeiro de um par \r\n com awk

cat file | awk -vRS='\r?\n' 1 | sed -n l

Saídas xyz$

Para corrigir o problema:

cat file | awk -vRS='\r?\n' 1 > file.fixed

Por que esse comportamento?

Quando a saída cat file é exibida em um terminal, o \r (Retorno de carro) faz o que é (foi) destinado a fazer, ou seja. Retorne o carro totalmente para a esquerda. Para o terminal, isso significa que o ponto de inserção de texto é movido para a borda esquerda da tela - a terminologia e conceito de \r derrives da era da máquina de escrever manual, quando o Transporte era Retornado para a margem esquerda (por uma alavanca manual), e uma vez na margem esquerda, o rolo avançaria o papel para baixo em 1 linha, ou seja, Fed o papel 1 Linha .

No terminal, porque você tem b após \r , o b sobrescreve o a colocado anteriormente na coluna 1.

    
por 25.06.2015 / 12:10
0

Este é provavelmente um problema new-line vs cariage-return . Eu acho que o novo arquivo só tem os caracteres cariage-return ^M em vez de novas linhas. Experimente file /path/to/new.file e veja se ele retorna ASCII text, with CR line terminators

No seu caso, o a é impresso seguido pela linha de entrada que tem o terminador de linha ^M , dizendo para ir ao início da linha e, em seguida, imprimir b .

    
por 25.06.2015 / 12:10
0

Você tem um retorno de carro no novo arquivo (^ M) em vez de um avanço de linha (^ J) no final da linha. Tente usar cat -v new.file e também olhando para o arquivo usando hd.

Você pode remover os retornos de carro externos usando sed assim:

sed 's / \ r //' new.file

    
por 25.06.2015 / 12:10