Voici quelques awk
solutions "pures" :
Si les index sont toujours la même séquence entière incrémentée (6115-6119), comme dans vos exemples de données, vous pouvez utiliser un "raccourci" algorithmique:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Cela ne
- Ajoutez toutes les lignes au tableau
a
, réparties aux positions d'index 6115-6119
- Sur chaque 4ème ligne (
!(NR%4)
), parcourez le contenu du tableau pour imprimer dans l'ordre souhaité.
Si vos index numériques sont toujours les quatre mêmes, mais pas une séquence entière incrémentée, vous devrez trier:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Remarque: Ceci est avec GNU awk, d'autres peuvent ne pas prendre en charge asort
.
Si chaque bloc de quatre peut avoir des ID numériques différents:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Remarque: TIL de @Gilles auto-réponse (+2) dont cette utilisation delete
n'est pas (encore) POSIX, mais universellement pris en charge .
Une version avec l'utilisation ™ correcte de delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Une version sans suppression, utilisant plus de mémoire et de dimensions:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}