นี่คือ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
อาจไม่สนับสนุน
หาก block-of-Four ทุกตัวอาจมี ID ตัวเลขแตกต่างกัน:
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++}