Hier sind einige "reine" awk
Lösungen:
Wenn die Indizes immer die gleiche inkrementelle Ganzzahlfolge (6115-6119) wie in Ihren Beispieldaten haben, können Sie eine algorithmische "Verknüpfung" verwenden:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Das macht
- Fügen Sie dem Array alle Zeilen hinzu, die
a
an den Indexpositionen 6115-6119 verteilt sind
!(NR%4)
Durchlaufen Sie in jeder vierten Zeile ( ) den Inhalt des Arrays, um in der gewünschten Reihenfolge zu drucken.
Wenn Ihre numerischen Indizes immer die gleichen vier sind, aber keine inkrementelle Ganzzahlfolge, müssen Sie sortieren:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Hinweis: Dies ist bei GNU awk der Fall, andere unterstützen dies möglicherweise nicht asort
.
Wenn jeder Viererblock unterschiedliche numerische IDs haben könnte:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Hinweis: Bisdelete
von @Gilles Selbstantwort (+2) ist diese Verwendung (noch) nicht POSIX, aber universell unterstützt .
Eine Version mit der korrekten Verwendung von delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Eine Version ohne Löschen mit mehr Speicher und Abmessungen:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}