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.