Вот несколько «чистых» awk
растворов:
Если индексы всегда представляют собой одну и ту же возрастающую целочисленную последовательность (6115 -6119 ), как в вашем образце данных -, вы можете использовать алгоритмический «ярлык»:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Это делает
a
, распределенные по позициям индекса 6115 -6119 !(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 -ответ (+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++}