2012-10-30 18 views
7

Mam tabeli, który wygląda mniej więcej tak:sortowania na dwie kolumny w vim

 
FirstName SurName;Length;Weight; 

trzeba posortować na długości, a jeśli długość jest równa dla jednego lub więcej nazw, muszę uporządkować te na wadze. sort ni sortuje tylko na długość, próbowałem też sort /.\{-}\ze\dd/, ale to też nie działało.

Każda pomoc będzie bardzo ceniona!

Odpowiedz

6

Można to zrobić za pomocą zewnętrznego (GNU) sortuj całkiem wprost:

!sort -t ';' -k 2,2n -k 3,3n 

mówi to: pola podzielone średnikiem, sortowanie przez 2 pola numerycznie, następnie przez 3 pola numerycznie. Prawdopodobnie o wiele łatwiejsze do odczytania i zapamiętania niż jakakolwiek wewnętrzna komenda vim, którą możesz ugotować.

Znacznie więcej informacji na temat GNU sort tutaj: http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

1

Spróbuj z flagą r.

Sortuj długości:

:%sort rni /.*;\ze\d/ 

Sortowanie na wadze:

:%sort rni /\d+\ze;$/ 

Bez tej flagi, sortowanie odbywa się na tym, co przychodzi po meczu, który może być trochę uciążliwe.

Przy pomocy flagi r sortowanie odbywa się na samym dopasowaniu, które może być łatwiejsze do zdefiniowania. W tym przypadku wzorzec dopasowuje serię 1 lub więcej cyfr tuż przed średnikiem na końcu linii.

+0

': sort' ma ten sam efekt':% sort' z jednym naciśnięciem klawisza mniej :) - i pytanie jest sposób sortowania na długości, a regex pasuje do wagi. – mMontu

+0

Masz rację co do ':% sort' przeciwko': sort ', oczywiście. Ale proponuję dwa polecenia: jeden dla wagi, a drugi dla długości. – romainl

Powiązane problemy