msort(1)
được thiết kế để có thể sắp xếp các tệp với các bản ghi nhiều dòng. Nó có một gui tùy chọn, cũng như một phiên bản dòng lệnh bình thường và có thể sử dụng cho con người. (Ít nhất, con người thích đọc hướng dẫn cẩn thận và tìm ví dụ ...)
AFAICT, bạn không thể sử dụng một mẫu tùy ý cho các bản ghi, vì vậy trừ khi các bản ghi của bạn có kích thước cố định (tính bằng byte, không phải ký tự hoặc dòng). msort
không có -b
tùy chọn cho các bản ghi là các khối dòng được phân tách bằng các dòng trống.
Bạn có thể chuyển đổi đầu vào của mình thành một định dạng sẽ hoạt động -b
khá dễ dàng, bằng cách đặt một dòng trống trước mỗi ###...
(trừ cái đầu tiên).
Theo mặc định, nó in số liệu thống kê trên stderr, vì vậy ít nhất nó cũng dễ dàng biết được khi nào nó không sắp xếp vì nó nghĩ rằng toàn bộ đầu vào là một bản ghi.
msort
hoạt động trên dữ liệu của bạn. Các sed
lệnh prepends một dòng mới để mỗi #+
dòng trừ dòng 1. -w
loại toàn bộ hồ sơ (thứ tự từ điển). Có các tùy chọn để chọn phần nào của bản ghi để sử dụng làm khóa, nhưng tôi không cần chúng.
Tôi cũng bỏ đi tước bỏ các dòng mới.
$ sed '2,$ s/^#\+/\n&/' unsorted.records | msort -b -w 2>/dev/null
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34
Tôi đã không có bất kỳ may mắn nào -r '#'
để sử dụng nó như là một phân tách kỷ lục. Nó nghĩ rằng toàn bộ tập tin là một bản ghi.