Сортировка столбца без изменения других столбцов

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 +, а не относительно продвинутые инструменты, такие как sed/ awk. Более важно знать себя, насколько ограничен режим визуального блока по сравнению, скажем, с визуальным режимом.

Любит вероятность
источник
Это не решит вашу проблему, но обратите внимание, что sortдоступна внутренняя команда vim , поэтому вам не нужно вызывать external !sortдля выполнения обычной сортировки.
Далкер
2
Фильтры работают только на линиях .
Ромен
@ Далкер Да, спасибо. Но я уже попробовал то, что дало похожий результат.
Любит Вероятность
@romainl Это так? Нет лучей надежды? Я редко нахожу, что происходит с Vim! Но, тем не менее, не странно ли говорить «Фильтры работают только на линиях » после того, как вы выбрали что-то еще и никаких признаков проблемы до выхода? Если это не выдает предупреждение / ошибку, я бы даже сказал, что это ошибка.
Любит Вероятность
Жук? Ахах нет. Поведение не только документировано ( :help filter), но и стандартизировано (извините, я не знаю, как глубоко связать эту POS). Вы не можете жаловаться, если вы не RFTM.
Ромен

Ответы:

9

Я думаю, что ваша лучшая надежда - плагин vis.vim . Этот плагин предоставляет команду, Bкоторая позволяет применить команду к блоку.

Здесь после установки плагина вы выбираете свой блок и затем используете:

:'<,'>B !sort

Обратите внимание, что команда может быть чем угодно, поэтому вместо !sortвас можно выполнить много другой обработки блока, например сохранить ее в другом файле ( :'<,'>B w foo.txt) или применить подстановку ( :'<,'>B s/foo/bar/g).

statox
источник
1
@LovesProbability, Если вы пытаетесь отсортировать третий столбец без изменения их первых двух столбцов, этот поток может быть полезен.
Джейр Лопес
@ JairLópez Без обид, очень забавно, как кто-то скопировал мой вопрос куда-то еще, где его попросили вернуться к первоисточнику (то есть к этой странице рядом с перефразированной копией этого ответа) и, наконец, Вы просите меня найти ответ там.
Любит Вероятность
Спасибо за ваш комментарий, я сделал это, потому что (1) и ваш вопрос, и этот ответ были интересными; (2) может быть, вы не одиноки, и может быть больше людей интересуются; (3) это прекрасная возможность помочь кому-то понять, как $используется блочный визуальный режим.
Джейр Лопес