Berikut adalah beberapa awk
solusi "murni" :
Jika indeks selalu sama dengan urutan bilangan bulat (6115-6119), seperti pada data sampel Anda, Anda dapat menggunakan "pintasan" algoritmik:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Ini tidak
- Tambahkan semua baris ke array
a
, didistribusikan di posisi indeks 6115-6119
- Pada setiap baris ke-4 (
!(NR%4)
), loop melalui isi array untuk mencetak dalam urutan yang diinginkan.
Jika indeks numerik Anda selalu empat yang sama, tetapi bukan urutan bilangan yang bertambah, Anda harus mengurutkan:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Catatan: Ini dengan GNU awk, yang lain mungkin tidak mendukung asort
.
Jika setiap blok-of-empat dapat memiliki ID numerik yang berbeda:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Catatan: TIL dari @Gilles menjawab sendiri (+2) penggunaan delete
ini bukan (belum) POSIX, tetapi didukung secara universal .
Versi dengan penggunaan ™ yang benar dari delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Versi tanpa hapus, menggunakan lebih banyak memori dan dimensi:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}