Saya pikir saya cukup berpengalaman sekarang dalam mengurutkan berdasarkan kolom ; Namun, saya belum menemukan apa pun sejauh ini bagaimana mengurutkan baris terus menerus .
Andaikata kita memiliki file teks yang terlihat seperti ini: (tentu saja sangat disederhanakan)
Echo
Alpha
Delta
Charlie
Golf
Bravo
Hotel
Foxtrot
Sekarang, apakah mungkin untuk mengurutkan garis secara alfanumerik per setiap blok secara terpisah ? Maksud saya, sehingga hasilnya terlihat seperti ini:
Alpha
Charlie
Delta
Echo
Bravo
Foxtrot
Golf
Hotel
Bercerita dari apa yang saya temukan di sort
halaman manual, ini mungkin tidak dapat dilakukan dengan sort
perintah UNIX bawaan. Atau bahkan dapat dilakukan tanpa harus menggunakan alat eksternal / pihak ketiga?
sumber
awk
solusi yang menghindarisort
overhead! Sneaky!Mengatur pemisah rekaman
RS
ke string kosong membuat langkah awk dalam paragraf sekaligus. Untuk setiap paragraf, pipa paragraf (dalam$0
) ke cmd (yang diatur kesort
) dan cetak hasilnya. Cetak baris kosong untuk memisahkan paragraf keluaran dengan aprint ""
.Jika kita memberikan contoh perl, maka saya menyajikan pendekatan alternatif daripada pendekatan Stephane:
Hapus setel pemisah bidang (
undef $/
), ini memungkinkan kami untuk menggunakan<>
dan mendapatkan seluruh STDIN. Kami kemudiansplit
bahwa sekitar\n\n
(paragraf).foreach
"paragraf",sort
baris-baris dengan menyatukansplit
baris-baris baru,sort
dan kemudianjoin
menyatukannya kembali dan menempel pada sebuah garis\n
.Namun, ini memiliki satu efek samping menambahkan pemisah "paragraf tertinggal" pada paragraf terakhir (jika belum ada sebelumnya). Anda bisa menyiasatinya dengan yang sedikit kurang cantik:
Ini menugaskan paragraf ke
@list
, dan kemudian ada "operasi ternary" untuk memeriksa apakah itu adalah elemen terakhir dariforeach
(\$_ == \$list[-1]
cek). cetak""
jika (? ...
), else (: ...
) cetak"\n"
untuk semua "paragraf" (elemen@list
) lainnya.sumber
/usr/bin/sort
dengan garis itu atau apakah ituawk
perintah "semacam" bawaan?Saya menulis sebuah alat di haskell yang memungkinkan Anda untuk menggunakan sort, shuf, tac atau perintah lain pada paragraf teks.
https://gist.github.com/siers/01306a361c22f2de0122
EDIT: alat ini juga termasuk dalam repo ini: https://github.com/siers/haskell-import-sort
Ini membagi teks menjadi blok, bergabung dengan subblok dengan
\0
char, pipa melalui perintah dan akhirnya melakukan hal yang sama secara terbalik.28-08-2015 : Saya menemukan penggunaan pribadi lain untuk alat ini - memilih N paragraf setelah baris.
sumber
Jika Anda memiliki GNU awk yang tersedia, Anda dapat mengurutkan setiap blok menggunakan
asort()
fungsi bawaan. Sesuatu seperti ini:blocksort.awk
Jalankan seperti ini:
sumber
TXR Lisp langkah demi langkah:
Referensi: dapatkan-baris , partisi * , op , di mana , rantai , panjang , zerop , mapcar , interpose .
sumber
[mapcar sort ...]
kita bisa menggantisort
dengan fungsi yang menyalurkan string melalui proses eksternal. Kita kemudian dapat berakhir dengan alat untuk mendistribusikan perintah eksternal pemrosesan teks melalui paragraf.