Вот несколько «чистых» awk
решений:
Если индексы всегда имеют ту же последовательность приращения целых чисел (6115-6119), что и в ваших данных выборки, вы можете использовать алгоритмический «ярлык»:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Это делает
- Добавьте все строки в массив
a
, распределенные по позициям индекса 6115-6119
- В каждой 4-й строке (
!(NR%4)
) просматривайте содержимое массива для печати в нужном порядке.
Если ваши числовые индексы всегда являются четырьмя одинаковыми, но не последовательностью целочисленного увеличения, вам придется выполнить сортировку:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Примечание: это с GNU awk, другие могут не поддерживать asort
.
Если каждый блок из четырех может иметь разные числовые идентификаторы:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Примечание: TIL от @Gilles self-answer (+2) это использование delete
не (пока) POSIX, но универсально поддерживается .
Версия с правильным использованием ™ delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Версия без удаления, использующая больше памяти и размеров:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}