O comando Awk não está funcionando corretamente

0

Eu tenho um problema muito simples, mas por motivos ele não funciona corretamente ...

Eu tenho esses arquivos .txt no seguinte formato

2    250    1
4    250    1
5    250    1

Eu queria subtrair 1 dos números da primeira coluna, produzindo:

1    250    1
3    250    1
4    250    1

Estou usando este código no bash:

awk '{ print $1-1,$2,$3 }' file.txt > newfile.txt

Eu acho que este código é bom, no entanto, devido ao fato de que esses arquivos de texto têm sua extensão de arquivo alterada de .csv para .txt , esta linha de awk parece não funcionar bem. Isso produz:

1    250    1
4

Quaisquer alternativas que funcionem bem com esses arquivos de texto que eu tenho?

updates: Eu usei o editor pico para gerar novamente um desses arquivos, e agora o código acima funciona perfeitamente, então deve haver algo errado nos arquivos de texto originais em termos de formatação e propriedades ... alguma idéia?

    
por Gabriel 10.03.2016 / 01:27

3 respostas

1

O problema descrito parece estar relacionado a finais de linha. Se os arquivos de texto tiverem terminações de linha de retorno de carro / linha de alimentação, awk verá o retorno de carro como apenas outro caractere de espaço em branco e substituirá o texto na saída.

OP corrigiu o problema editando com pico (que assume o fim da linha de alimentação de linha, de acordo com este Forma mais fácil de definir quebras de linha página). Também é possível usar programas como dos2unix para corrigir os fins de linha.

Leitura adicional:

por 10.03.2016 / 02:11
1

O que @Thomas Dickey estava dizendo parece ser a solução!

Eu usei este código perl -pe 's/\r\n|\n|\r/\n/g' para converter os arquivos de texto em formato unix. É semelhante ao programa dos2unix. Agora, o Awk está funcionando perfeitamente!

Obrigado a todos

    
por 10.03.2016 / 02:47
1

A utilidade unix2dos/dos2unix resolveria esse problema com bastante facilidade. Se você tiver uma máquina UNIX/Linux , tente instalá-la e executar isso:

dos2unix file

Em UNIX/Linux , antes de processar qualquer arquivo de texto, é razoável executar o utilitário file para saber que tipo de endianness ele possui.

    
por 10.03.2016 / 05:22