Ecco alcune awk
soluzioni "pure" :
Se gli indici hanno sempre la stessa sequenza di numeri interi incrementali (6115-6119), come nei dati di esempio, è possibile utilizzare un "collegamento" algoritmico:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Questo fa
- Aggiungi tutte le linee all'array
a
, distribuite nelle posizioni di indice 6115-6119
- Ogni 4a riga (
!(NR%4)
), scorrere i contenuti dell'array per stampare nell'ordine desiderato.
Se i tuoi indici numerici sono sempre gli stessi quattro, ma non una sequenza intera incrementale, dovrai ordinare:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Nota: questo è con GNU awk, altri potrebbero non supportare asort
.
Se ogni blocco di quattro potrebbe avere ID numerici diversi:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Nota: TIL dalla risposta automatica di @Gilles (+2) questo uso delete
non è (ancora) POSIX, ma universalmente supportato .
Una versione con l'uso corretto ™ di delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Una versione senza cancellazione, usando più memoria e dimensioni:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}