2012-10-30 13 views
7

Ho una tabella che sembra qualcosa di simile:ordinamento su due colonne in vim

 
FirstName SurName;Length;Weight; 

ho bisogno di ordinare alla durata, e se la lunghezza è uguale per uno o più nomi, ho bisogno di ordinare quelli a peso. sort ni sorta solo in lunghezza, ho provato sort /.\{-}\ze\dd/ anche questo, ma che non ha funzionato neanche.

Qualsiasi aiuto sarebbe molto apprezzato!

risposta

6

Questo può essere fatto utilizzando un monitor esterno (GNU) sorta abbastanza semplicemente:

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

Questo dice: divide i campi da virgola, ordina per secondo campo numerico, quindi entro il 3 campo numerico. Probabilmente è molto più facile da leggere e ricordare rispetto a qualsiasi comando interno-vim che puoi cucinare.

Molto più informazioni GNU sorta qui: http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html

1

Prova con la bandiera r.

Ordina su Lunghezza:

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

Ordina on Peso:

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

Senza questo flag, l'ordinamento viene eseguito su ciò che viene dopo la partita, che può essere un po 'ingombrante.

Con la bandiera r, l'ordinamento è fatto sulla partita in sé, che può essere più facile da definire. Qui, il modello corrisponde a una serie di 1 o più cifre appena prima di un punto e virgola alla fine della riga.

+0

': sort' ha lo stesso effetto di':% sort' con uno in meno battitura :) - e la questione è come ordinare alla durata, e la vostra regex corrisponde al peso. – mMontu

+0

Hai ragione su ':'% sort' vs: sort', naturalmente. Ma propongo due comandi: uno per il peso e l'altro per la lunghezza. – romainl