Extra% na saída do script awk

1

Eu tenho o seguinte script no awk que resume todas as colunas em um arquivo que eu canalizo para ele:

#sum_all.awk
{   for (i=1; i<=NF; i++) { sum[i]+= $i }   }

END { for (i=1; i<=NF; i++ ) { printf "%d ", sum[i] } }

por exemplo: cat my_file.txt | awk -f sum_all.awk

com my_file.txt :

5 7 8
1 0 2

saídas:

6 7 10 %

Como posso me livrar desse último caractere % ?

    
por Amelio Vazquez-Reina 12.12.2012 / 17:21

2 respostas

1

Como manatwork já comentou , o % não faz parte da saída do awk, é o próximo prompt do shell. No bloco END , para este arquivo de entrada, há três chamadas para printf . O primeiro gera 6 e um espaço, o segundo gera 7 e um espaço, e o terceiro gera 10 e um espaço. Depois disso, o awk sai e o shell imprime seu prompt.

Se um comando imprimir alguma saída que não termine em uma nova linha (ou, mais geralmente, se não deixar o cursor no início de uma linha), dependendo da configuração do seu shell, o shell imprimirá seu prompt após a saída do comando na mesma linha, ou o shell poderá apagar a linha não terminada e imprimir seu prompt no início da linha.

Para garantir que a saída de um comando seja totalmente visível, certifique-se de que ele termine em uma nova linha (a menos que o comando não produza saída, é claro). Em sistemas unix, um arquivo de texto não vazio sempre termina com uma nova linha, porque os arquivos de texto consistem em uma série de linhas (possivelmente vazias), cada uma consistindo em uma série (possivelmente vazia) de caracteres que não seja newline (e null bytes). A maioria dos utilitários tende a ser projetada para lidar principalmente com arquivos de texto, portanto, certifique-se de que a saída do seu comando seja um arquivo de texto válido.

Após imprimir os campos, imprima uma "\n" (a notação awk para um caractere de nova linha) ou chame a função print , que adiciona uma nova linha após o texto impresso.

END { for (i=1; i<=NF; i++) printf "%d ", sum[i]; print ""; }

ou, para evitar um espaço extra no final da linha:

END { for (i=1; i<NF; i++) printf "%d ", sum[i]; printf "%d\n", sum[NF]; }

ou

END { printf "%d"; for (i=2; i<=NF; i++) printf " %d", sum[i]; print ""; }

ou

END { for (i=1; i<NF; i++ ) printf "%d%s", sum[i], (i==NR ? "\n" : " "); }
    
por 13.12.2012 / 00:56
2
END { for (i=1; i<=NF; i++ ) { printf "%d ", sum[i] } ; print "" }
    
por 12.12.2012 / 17:51