Saya memiliki file teks dalam format ini:
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY3
VAL31
VAL32
VAL33
VAL34
Saya ingin menyortir file ini dengan KEY
baris dan menjaga 4 baris berikutnya dengan itu sehingga hasil diurutkan harus:
####################################
KEY1
VAL11
VAL12
VAL13
VAL14
####################################
KEY2
VAL21
VAL22
VAL23
VAL24
####################################
KEY3
VAL31
VAL32
VAL33
VAL34
apakah ada cara untuk melakukan ini?
Jawaban:
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. Thesed
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.
Saya tidak beruntung
-r '#'
menggunakannya sebagai pemisah rekaman. Itu mengira seluruh file adalah satu catatan.sumber
msort
sangat berguna; terima kasih (-r
sepertinya itu karena ada lebih dari satu # yang saya gunakan-d
dan berhasilmsort -qwr '#' ex
bekerja untuk saya (baik itu memisahkan pemisah rec output)Solusi adalah pertama-tama mengubah umpan baris di dalam blok ke karakter yang tidak digunakan pilihan Anda ('|' dalam contoh di bawah), untuk mengurutkan hasilnya dan mengubah kembali pemisah yang dipilih ke umpan baris asli:
sumber
;N
sana, dan itu bisa sulit untuk menemukan karakter yang tidak digunakan dalam teks itu sendiri; ini sangat baik untuksort
atauawk
, ... dapat melakukan penyortiran multilineperl -0
slurps seluruh file/(....)/g
cocokkan dan ekstrak catatanprint sort ...
urutkan dan cetaklahsumber
Berikut cara lain yang dapat digunakan dengan sejumlah baris di
KEY
bagian:Ini berfungsi dengan menyimpan pembatas ke variabel (untuk kemudian menghapusnya dari input). Kemudian menambahkan
KEY*
ke setiap baris di bagian yang sesuai menggunakan char ascii rendah (yang tidak mungkin terjadi pada input Anda) sebagai pemisah dan kemudiann
umber semual
ines menggunakan pemisah yang sama. Maka hanya masalahsort
dengan bidang 3 dan 1 dancut
ting kolom tengah dan kemudian mengembalikan pembatas melalui finalsed
. Perhatikan bahwa dengan hal di atas,KEY12
akan mengurutkan sebelumKEY2
jadi sesuaikansort
perintah sesuai kebutuhan Anda.sumber
Anda dapat menggunakan perpustakaan stdlib POSIX Awk :
sumber