Aquí hay algunas awk
soluciones "puras" :
Si los índices son siempre la misma secuencia entera incremental (6115-6119), como en sus datos de muestra, puede usar un "acceso directo" algorítmico:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Esto hace
- Agregue todas las líneas a la matriz
a
, distribuidas en las posiciones de índice 6115-6119
- En cada cuarta línea (
!(NR%4)
), recorra el contenido de la matriz para imprimir en el orden deseado.
Si sus índices numéricos son siempre los mismos cuatro, pero no una secuencia entera incremental, tendrá que ordenar:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Nota: Esto es con GNU awk, otros pueden no ser compatibles asort
.
Si cada bloque de cuatro pudiera tener diferentes ID numéricos:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Nota: TIL de @Gilles auto-respuesta (+2) este uso delete
no es (todavía) POSIX, pero es universalmente compatible .
Una versión con el uso correcto ™ de delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Una versión sin borrar, usando más memoria y dimensiones:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}