Aqui estão algumas soluções "%"awk
"puras":
Se os índices forem sempre a mesma sequência inteira de incremento (6115-6119), como em seus dados de 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 os seus índices numéricos são sempre os mesmos, mas não uma sequência inteira de incrementos, você terá que ordenar:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Nota: Isso é com o GNU awk, outros podem não suportar asort
.
Se cada bloco de quatro puder 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 de auto-resposta @Gilles (+2) esse uso de delete
não é (ainda) 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++}