排序一列而不更改其他列


10

我最近意识到过滤!技术,我很喜欢它。不幸的是,我无法在可视块模式下使用它。希望这里的专家能帮助我。

基本上,我想对列进行排序,例如下面的第三列(仅是MWE)。而且我不想在排序时打扰其他列。

我尝试!通过sort实用程序过滤()可视(块模式)选择的第三列。但是排序实际上超出了选择范围,也就是说,所有行都被交换,而不仅仅是选择范围,这也是基于第一列的!

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

我使用可视块选择了最后一列,并说!sort --reverse显示为

'<,'>!sort --reverse

结果与我的预期相反。结果将对整个行进行排序/交换,而不仅仅是一行,而且也基于第一列,无论我选择的是第三列!

 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   

除非另有可能,否则我将需要一个纯粹的vim + sort解决方案,而不是相对高级的工具sed/ awk。更重要的是要了解自己,与视觉模式相比,视觉阻挡模式的局限性如何。


这不能解决您的问题,但是请注意,有一个vim内部sort命令可用,因此您无需调用外部命令即可!sort进行常规排序。
Dalker

2
过滤器仅可在线使用
romainl

@Dalker是的,谢谢。但是我已经尝试过了,结果也差不多。
Loves Probability

@romainl是吗?没有希望的光芒?我很少发现Vim会发生这种情况!但无论如何,这不是很奇怪地说“在过滤器上唯一的工作线,你选择了别的东西,直到输出没有任何问题的迹象后”?如果它没有弹出警告/错误,我什至会认为这是一个错误。
Loves Probability

有毛病吗 哈哈不。该行为不仅记录在案(:help filter),而且已标准化(很抱歉,我不知道如何对该POS进行深度链接)。如果您没有RFTM,就不会抱怨。
romainl

Answers:


9

我认为您最大的希望是vis.vim插件。该插件提供了一个命令B,该命令允许将命令应用于块。

在安装插件之后,您可以在此处选择块,然后使用:

:'<,'>B !sort

请注意,该命令可以是任何命令,因此可以代替对!sort块执行许多其他处理,例如将其保存到另一个文件(:'<,'>B w foo.txt)或应用替换(:'<,'>B s/foo/bar/g


1
@LovesProbability,如果您尝试对第三列进行排序而不更改其前两列,则此线程可能会有所帮助。
贾尔·洛佩斯

@JairLópez没有冒犯,真的很有趣,有人将我的问题复制到其他地方,在那里他被要求返回原始信息源(即此页面的答案副本)。最后你让我去那里找到答案。
Loves Probability

感谢您的评论,我这样做是因为(1)您的问题和答案都很有趣;(2)也许您并不孤单,可能会有更多人对此感兴趣;(3)这是一个很好的机会,可以帮助人们了解如何$在块状视觉模式下使用它。
JairLópez'16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.