Dưới đây là một số awk
giải pháp "thuần túy" :
Nếu các chỉ mục luôn luôn là một chuỗi số nguyên tăng dần (6115-6119), như trong dữ liệu mẫu của bạn, bạn có thể sử dụng một "phím tắt" thuật toán:
awk '{a[$1]=$0} !(NR%4){for(i=6115;i<6119;print a[i++]);}'
Cái này không
- Thêm tất cả các dòng vào mảng
a
, được phân phối tại các vị trí chỉ mục 6115-6119
- Trên mỗi dòng thứ 4 (
!(NR%4)
), lặp qua các nội dung mảng để in theo thứ tự mong muốn.
Nếu các chỉ mục số của bạn luôn là bốn chỉ số giống nhau, nhưng không phải là một chuỗi số nguyên tăng dần, bạn sẽ phải sắp xếp:
awk '{a[$1]=$0} !(NR%4){asort(a,b); for(i=1;i<5;print b[i++]);}'
Lưu ý: Đây là với GNU awk, những người khác có thể không hỗ trợ asort
.
Nếu mỗi khối bốn có thể có ID số khác nhau:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;print a[i++]); delete a}'
Lưu ý: TIL từ @Gilles tự trả lời (+2) việc sử dụng delete
này không phải (chưa) POSIX, nhưng được hỗ trợ phổ biến .
Phiên bản có sử dụng ™ chính xác delete
:
awk '{a[$1]=$0} !(NR%4){asort(a); for(i=1;i<5;delete a[i++]){print a[i]}}'
Một phiên bản không xóa, sử dụng nhiều bộ nhớ và kích thước hơn:
awk '{a[n][$1]=$0} !(NR%4){asort(a[n]); for(i=1;i<5;print a[n][i++]); n++}