Aqui estão algumas awk
soluções "puras" :
Se os índices são sempre a mesma sequência inteira incremental (6115-6119), como nos dados da amostra, você pode usar um "atalho" algorítmico:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Isso faz
- Adicione todas as linhas à matriz
a
, distribuídas nas posições de índice 6115-6119
- Em cada quarta linha (
!(NR%4)
), percorra o conteúdo da matriz para imprimir na ordem desejada.
Se seus índices numéricos são sempre os quatro mesmos, mas não uma sequência inteira incremental, você precisará classificar:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Nota: Isso ocorre com o GNU awk, outros podem não suportar asort
.
Se cada bloco de quatro pudesse ter IDs numéricos diferentes:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Nota: TIL da resposta automáticadelete
do @Gilles (+2) esse uso de (ainda) não é POSIX, mas é universalmente suportado .
Uma versão com o uso correto de delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Uma versão sem exclusão, usando mais memória e dimensões:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}