1 voto positivo 0 votos negativos
186 visitas
em Scripts em AWK por colaborador (6,8K pontos)
republicada por

1 Resposta

2 votos positivos 0 votos negativos
por monitor (15,8K pontos)
selecionada por
 
Melhor resposta

A rigor, não existe uma forma padrão do AWK. As normas POSIX recomendam apenas que exista uma forma de ordenamento de arrays (estou procurando a fonte), mas nem todas as implementações do AWK têm isso.

Algumas soluções com o Gawk:

Se você quer ordenar a saída utilizando apenas o awk, uma solução é armazenar cada linha resultante numa array e ordená-la com a função asort() ou asorti() (ambas da implementação GNU - gawk).

Por exemplo, considerando o arquivo teste.txt:

:~$ cat teste.txt 
banana
abacate
laranja
amora
pera

Seu programa poderia fazer algo como:

:~$ awk '{ arr[NR] = $0 } END { asort(arr); for (n in arr) print arr[n]; }' teste.txt
abacate
amora
banana
laranja
pera

A função asort() altera os índices!

A função asorti() faz quase a mesma coisa, a diferença é que podemos ordenar a array pelos índices e copiar o resultado para uma variável de destino:

:~$ awk '{ arr[NR] = $0 } END { asorti(arr, dest); for (n in arr) print dest[n]" "arr[n];  }' teste.txt
1 banana
2 abacate
3 laranja
4 amora
5 pera

Obviamente, neste exemplo os índices já estavam ordenados, mas acho que deu para entender a ideia. ;-)

Alternativamente, ainda com o gawk, você pode fazer o ordenamento dos valores da array com as strings de controle utilizadas na variável interna PROCINFO["sorted_in"]:

"@unsorted"     - comportamento padrão.
"@ind_str_asc"  - ordem ascendente das strings.
"@ind_num_asc"  - ordem numérica ascendente.
"@val_type_asc" - ordem ascendente de valores (números primeiro).
"@val_str_asc"  - ordem ascendente de valores como strings.
"@val_num_asc"  - ordem ascendente de valores numéricos.
"@ind_str_desc"  - ordem descendente das strings.
"@ind_num_desc"  - ordem numérica descendente.
"@val_type_desc" - ordem descendente de valores (números primeiro).
"@val_str_desc"  - ordem descendente de valores como strings.
"@val_num_desc"  - ordem descendente de valores numéricos.

Se a exclusividade de uso de recursos do awk não for um problema:

Se quiser um resultado menos trabalhoso, porém, a melhor pedida é utilizar o utilitário sort:

awk '{ programa }' arquivos | sort [opções]
por monitor (15,8K pontos)
0 0
Me perdoem as várias edições, mas o plugin do editor markdown tem um problema com blocos de código que eu levei um tempo para contornar. Até que eu encontre uma solução, os blocos de código precisam ser feitos com a inclusão de 4 espaços antes de cada linha do texto.
Seja bem-vindo(a) à comunidade debxp, onde você pode fazer perguntas e receber respostas de outros membros.
Atenção pessoal, esta plataforma não é um fórum, embora se pareça muito com um. Neste tipo de ferramenta, o objetivo é fazer e responder perguntas que possam resultar em material de consulta para outras pessoas que tenham as mesmas dúvidas e dificuldades. Portanto, não há sentido em utilizarmos o Ask para socialização, para emitir opiniões pessoais ou para perguntas do tipo "quem usa isso ou aquilo". Espero que compreendam o nosso propósito. :-)
...