Sortowanie kolumny bez zmiany innych kolumn

10

Niedawno zdałem sobie sprawę z !techniki filtrowania i uwielbiam ją. Niestety nie jestem w stanie używać go w trybie wizualnego blokowania. Mam nadzieję, że niektórzy eksperci tutaj pomogą mi.

Zasadniczo chcę na miejscu posortować kolumnę, taką jak trzecia poniżej (tylko MWE). I nie chcę przeszkadzać innym kolumnom podczas sortowania.

Próbowałem odfiltrować ( !) wizualnie (tryb blokowy) wybraną trzecią kolumnę za pomocą sortnarzędzia. Ale sortowanie raczej wykracza poza zaznaczenie, tzn. Wszystkie wiersze są zamieniane, a nie tylko zaznaczenie, to też sortowanie na podstawie pierwszej kolumny!

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

Wybrałem ostatnią kolumnę za pomocą bloku wizualnego i powiedziałem, !sort --reversektóry pokazuje się jako

'<,'>!sort --reverse

A wynik jest dziwny w przeciwieństwie do tego, czego się spodziewałem. W wyniku posortowano / zamieniono całe wiersze, a nie tylko jedną kolumnę, i to również, w oparciu o pierwszą kolumnę, niezależnie od mojego wyboru trzeciej kolumny!

 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   

O ile nie jest to niemożliwe inaczej, chciałbym raczej czyste rozwiązanie sortowania vim + niż stosunkowo zaawansowane narzędzia, takie jak sed/ awk. Ważniejsze jest, aby wiedzieć, jak ograniczony jest tryb blokowania wizualnego w porównaniu do, powiedzmy, trybu wizualnego.

Kocha prawdopodobieństwo
źródło
To nie rozwiązuje twojego problemu, ale zauważ, że jest sortdostępne wewnętrzne polecenie vim , więc nie musisz wywoływać zewnętrznego, !sortaby wykonywać regularne sortowanie.
Dalker,
2
Filtry działają tylko na liniach .
romainl,
@Dalker Tak, dziękuję. Ale już tego próbowałem, co dało podobny wynik.
Loves Prawdopodobieństwo
@romainl Czy to wszystko? Żadnych promieni nadziei? Rzadko zdarza mi się, żeby tak się działo z Vimem !! Niemniej jednak, czy nie jest dziwne stwierdzenie „Filtry działają tylko na liniach ” po wybraniu czegoś innego i żadnych oznak problemu, dopóki nie zostaną wyświetlone dane wyjściowe? Jeśli nie wyskoczy ostrzeżenie / błąd, nawet twierdzę, że to BŁĄD.
Kocha prawdopodobieństwo
Błąd? Haha nie. Zachowanie jest nie tylko udokumentowane ( :help filter), ale także ustandaryzowane (przepraszam, nie wiem jak głęboko połączyć tego POS). Nie możesz narzekać, jeśli nie RFTM.
romainl

Odpowiedzi:

9

Myślę, że twoją najlepszą nadzieją jest wtyczka vis.vim . Ta wtyczka udostępnia polecenie, Bktóre pozwala zastosować polecenie do bloku.

Tutaj po zainstalowaniu wtyczki wybierz blok, a następnie użyj:

:'<,'>B !sort

Zauważ, że polecenie może być cokolwiek, więc zamiast tego !sortmożesz wykonać wiele innych operacji w bloku, takich jak zapisanie go w innym pliku ( :'<,'>B w foo.txt) lub zastosowanie podstawienia ( :'<,'>B s/foo/bar/g)

statox
źródło
1
@LovesProbability, jeśli próbujesz posortować trzecią kolumnę bez zmiany pierwszych dwóch kolumn, ten wątek może być pomocny.
Jair López,
@ JairLópez Bez urazy, to naprawdę zabawne, jak moje pytanie zostało skopiowane przez kogoś do kogoś innego, gdzie poproszono go o powrót do oryginalnego źródła (tj. Tej strony obok przeredagowanej kopii tej odpowiedzi), a na końcu prosisz mnie, żebym tam znalazł odpowiedź.
Kocha prawdopodobieństwo
Dziękuję za komentarz, zrobiłem to, ponieważ (1) zarówno twoje pytanie, jak i ta odpowiedź były interesujące; (2) może nie jesteś sam i może być więcej osób zainteresowanych; (3) jest to świetna okazja, aby pomóc komuś zrozumieć, jak $jest używany w blokowym trybie wizualnym.
Jair López