Ось кілька «чистих» 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 самовідповіді (+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++}