Menyortir kolom tanpa mengubah kolom lainnya

10

Baru-baru ini saya menyadari !teknik penyaringan , dan saya menyukainya. Sayangnya, saya tidak dapat menggunakannya dalam mode blok visual. Semoga beberapa ahli di sini akan membantu saya.

Pada dasarnya, saya ingin mengurutkan kolom seperti yang ketiga di bawah ini (hanya MWE). Dan saya tidak ingin mengganggu kolom lainnya ketika saya menyortir.

Saya mencoba memfilter ( !) kolom ketiga yang dipilih secara visual (mode blok) melalui sortutilitas. Tetapi jenisnya agak melampaui seleksi yaitu semua baris ditukar, bukan hanya seleksi, yang juga mengurutkan berdasarkan kolom pertama !

1.  LARGEST         40
2.  SECOND-LARGEST  168     
3.  MID             2.8     
4.  MID             540     
5.  MID             14.84   
6.  MID             40      
7.  SECOND-LEAST    64      
8.  LEAST           8

Saya memilih kolom terakhir menggunakan blok visual, dan mengatakan !sort --reverseyang muncul sebagai

'<,'>!sort --reverse

Dan hasilnya aneh berlawanan dengan apa yang saya harapkan. Hasilnya adalah seluruh baris diurutkan / ditukar, bukan hanya satu kolom, dan itu juga, berdasarkan kolom pertama terlepas dari pemilihan kolom ketiga saya!

 8.  LEAST           8    
 7.  SECOND-LEAST    64      
 6.  MID             40      
 5.  MID             14.84   
 4.  MID             540     
 3.  MID             2.8     
 2.  SECOND-LARGEST  168     
 1.  LARGEST         40   

Kecuali jika tidak mungkin, saya ingin solusi vim + sort murni, daripada alat yang relatif canggih seperti sed/ awk. Lebih penting untuk mengetahui sendiri, betapa terbatasnya mode blok visual, dibandingkan dengan mengatakan, mode visual.

Suka Probabilitas
sumber
Ini tidak menyelesaikan masalah Anda, tetapi perhatikan bahwa ada sortperintah internal vim yang tersedia, jadi Anda tidak perlu memanggil eksternal !sortuntuk melakukan pengurutan reguler.
Dalker
2
Filter hanya berfungsi pada saluran .
romainl
@Dalker Ya, terima kasih. Tapi saya sudah mencobanya, yang memberikan hasil serupa.
Loves Probability
@romainl Apakah itu? Tidak ada sinar harapan? Saya jarang menemukan itu terjadi dengan Vim !! Tetapi meskipun demikian, Apakah tidak aneh untuk mengatakan "Filter hanya bekerja pada baris " setelah Anda memilih sesuatu yang lain dan tidak ada tanda-tanda masalah sampai hasilnya? Jika tidak muncul peringatan / kesalahan, saya bahkan akan berpendapat bahwa itu adalah BUG.
Loves Probability
Bug? Haha tidak. Perilaku ini tidak hanya didokumentasikan ( :help filter) tetapi juga terstandarisasi (maaf, saya tidak tahu bagaimana cara menautkan POS itu). Anda tidak dapat mengeluh jika Anda tidak RFTM.
romainl

Jawaban:

9

Saya pikir harapan terbaik Anda adalah plugin vis.vim . Plugin ini menyediakan perintah Byang memungkinkan untuk menerapkan perintah ke blok.

Di sini setelah menginstal plugin, Anda akan memilih blok Anda dan kemudian gunakan:

:'<,'>B !sort

Perhatikan bahwa perintah itu bisa apa saja, jadi alih-alih !sortAnda bisa melakukan banyak pemrosesan lain di blok seperti menyimpannya ke file lain ( :'<,'>B w foo.txt) atau menerapkan substitusi ( :'<,'>B s/foo/bar/g)

statox
sumber
1
@LovesProbability, Jika Anda mencoba mengurutkan kolom ketiga tanpa mengubah dua kolom pertama mereka, utas ini bisa membantu.
Jair López
@ JairLópez Tanpa tersinggung, benar-benar lucu bagaimana pertanyaan saya disalin oleh seseorang ke tempat lain, di mana ia diminta untuk kembali ke sumber aslinya (yaitu halaman ini di samping salinan yang di-copy-ulang dari jawaban ini), dan akhirnya Anda meminta saya untuk mencari jawaban di sana.
Loves Probability
Terima kasih atas komentar Anda, saya melakukannya karena (1) pertanyaan Anda dan jawaban ini menarik; (2) mungkin Anda tidak sendirian dan mungkin ada lebih banyak orang yang tertarik; (3) ini adalah kesempatan bagus untuk membantu seseorang memahami bagaimana $digunakan dalam mode visual blockwise.
Jair López