Classificando uma coluna sem alterar outras colunas


10

Recentemente, eu estava ciente da !técnica de filtragem e adoro isso. Infelizmente, não consigo usá-lo no modo de bloqueio visual. Espero que alguns especialistas aqui me ajudem.

Basicamente, quero classificar no local uma coluna como a terceira abaixo (apenas um MWE). E não quero perturbar as outras colunas quando classifico.

Tentei filtrar ( !) a terceira coluna selecionada visualmente (modo de bloco) através do sortutilitário. Mas a classificação se estende além da seleção, ou seja, todas as linhas são trocadas, e não apenas a seleção, que também são classificadas com base na primeira coluna!

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

Selecionei a última coluna usando o bloco visual e disse o !sort --reverseque aparece como

'<,'>!sort --reverse

E o resultado é estranho, em oposição ao que eu esperava. O resultado tem todas as linhas classificadas / trocadas, não apenas uma coluna, e também com base na primeira coluna, independentemente da minha seleção da terceira coluna!

 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   

A menos que seja impossível, gostaria de uma solução pura de classificação vim +, em vez de ferramentas relativamente avançadas, como sed/ awk. É mais importante conhecer a mim mesmo, quão limitado é o modo de bloqueio visual, comparado com o modo visual.


Isso não resolve o seu problema, mas observe que há um sortcomando interno do vim disponível, portanto, você não precisa chamar o externo !sortpara fazer uma classificação regular.
Dalker

2
Os filtros funcionam apenas em linhas .
Romainl 10/10

@ Dalker Sim, obrigado. Mas eu já tentei isso, o que deu um resultado semelhante.
Loves Probability

@romainl É isso? Sem raios de esperança? Eu raramente acho isso acontecendo com o Vim !! No entanto, não é estranho dizer "Os filtros funcionam apenas em linhas " depois de selecionar outra coisa e nenhum sinal de problema até a saída? Se não aparecer um aviso / erro, eu diria mesmo que é um erro.
Loves Probability

Um inseto? Haha não. O comportamento não é apenas documentado ( :help filter), mas também padronizado (desculpe, não sei como vincular profundamente esse POS). Você não pode reclamar se não fizer o RFTM.
Romainl # 10/16

Respostas:


9

Eu acho que sua melhor esperança é o plugin vis.vim . Este plugin fornece um comando Bque permite aplicar um comando a um bloco.

Aqui, depois de instalar o plugin, você selecionaria seu bloco e usaria:

:'<,'>B !sort

Observe que o comando pode ser qualquer coisa; portanto, em vez de !sortvocê poder fazer muitos outros processamentos no bloco, salve-o em outro arquivo ( :'<,'>B w foo.txt) ou aplique uma substituição ( :'<,'>B s/foo/bar/g)


1
@LovesProbability, se você estiver tentando classificar a terceira coluna sem alterar as duas primeiras, esse segmento pode ser útil.
Jair López

@ JairLópez Sem ofensas, é realmente engraçado como minha pergunta é copiada por alguém para outro lugar, onde ele foi convidado a voltar à fonte original (ou seja, esta página ao lado de uma cópia reformulada desta resposta) e, finalmente, você me pede para encontrar uma resposta lá.
Ama Probabilidade

Obrigado pelo seu comentário, eu fiz isso porque (1) sua pergunta e esta resposta foram interessantes; (2) talvez você não esteja sozinho e possa haver mais pessoas interessadas; (3) é uma ótima oportunidade para ajudar alguém a entender como $é usado no modo visual em blocos.
Jair López
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.