Oto kilka „czystych” awk
rozwiązań:
Jeśli indeksy mają zawsze tę samą sekwencję rosnącą (6115-6119), co w danych przykładowych, można użyć algorytmicznego „skrótu”:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
To robi
- Dodaj wszystkie linie do tablicy
a
, rozmieszczone w pozycjach indeksu 6115-6119
- W każdej czwartej linii (
!(NR%4)
) przeglądaj zawartość tablicy, aby drukować w żądanej kolejności.
Jeśli indeksy liczbowe są zawsze tymi samymi czterema, ale nie rosnącą sekwencją liczb całkowitych, musisz posortować:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Uwaga: dotyczy GNU awk, inne mogą nie obsługiwać asort
.
Jeśli każdy blok czterech może mieć różne identyfikatory numeryczne:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Uwaga: TIL z @Gilles self-answer (+2) to użycie delete
nie jest (jeszcze) POSIX, ale powszechnie obsługiwane .
Wersja z prawidłowym użyciem ™ delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Wersja bez usuwania, wykorzystująca więcej pamięci i wymiarów:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}