msort(1)
dirancang untuk dapat mengurutkan file dengan catatan multi-line. Ini memiliki gui opsional, serta versi baris perintah normal dan dapat digunakan untuk manusia. (Setidaknya, manusia yang suka membaca manual dengan hati-hati dan mencari contoh ...)
AFAICT, Anda tidak bisa menggunakan pola arbitrer untuk catatan, jadi kecuali catatan Anda berukuran tetap (dalam byte, bukan karakter atau baris). msort
memang memiliki -b
opsi untuk catatan yang merupakan blok garis yang dipisahkan oleh garis kosong.
Anda dapat mengubah input Anda menjadi format yang akan bekerja dengan -b
cukup mudah, dengan meletakkan baris kosong di depan setiap ###...
(kecuali yang pertama).
Secara default, ini mencetak statistik pada stderr, jadi setidaknya mudah untuk mengetahui kapan tidak mengurutkan karena mengira seluruh input adalah satu catatan.
msort
bekerja pada data Anda. The sed
perintah menambahkan sebuah baris baru untuk setiap #+
baris kecuali baris 1. -w
macam seluruh catatan (leksikografi). Ada beberapa opsi untuk memilih bagian rekaman mana yang akan digunakan sebagai kunci, tetapi saya tidak membutuhkannya.
Saya juga meninggalkan stripping baris baru ekstra.
$ 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
Saya tidak beruntung -r '#'
menggunakannya sebagai pemisah rekaman. Itu mengira seluruh file adalah satu catatan.