Как сортировать по столбцу для строк, содержащих определенное слово

Я хочу сортировать по определенному столбцу только для строк, содержащих определенное слово. Я не хочу видеть строки, не содержащие этого слова. Например, у меня есть этот текстовый файл:

 sdf ggfds   7
 sdf sgs     5
 sdf dfgs    3
 foo dffg    2
 bar dffg    2
 sdf sddfg   4

Я хочу сортировать третий столбец для строк, содержащих только слово "sdf" (не должно быть в первом столбце)

и я хочу увидеть этот вывод:

 sdf dfgs    3
 sdf sddfg   4
 sdf sgs     5
 sdf ggfds   7

Ответ 1

Подключите ваш вход к внешней команде:

:%!grep sdf | sort -n -k3

Подробнее:

  • выберите весь контент, используя '%'
  • передать его внешней команде с помощью '!'
  • grep onyl строки, содержащие 'sdf'
  • сортировать эти строки численно (-n) в третьем поле (-k3)

Ответ 2

2 команды vim:

:v/sdf/d
:sort n /[^[:digit:]]*/
  • сначала удаляет все строки, которые не содержат 'sdf'
  • второй сортирует числа, игнорируя не номера.

Ответ 3

Максим Ким уже дал отличный ответ, и я собирался добавить это в комментарий, но он просто стал слишком сложным, поэтому я буду придерживаться его в ответ:

Вы можете упростить шаблон, используя:

:v/sdf/d
sort n /\D*/

как \D эквивалентен [^[:digit:]] и намного меньше печатает. Для получения дополнительной информации см.

:help \D

Для соответствия в третьем поле, а не только первой цифры используйте

:sort n /\(\S\+\s+\)\{2}/`

или

:sort n /\v(\S+\s+){2}/

См:

:help :sort
:help \S
:help \s
:help pattern.txt
:help \v

Как ни странно, некоторым легче запомнить :g!/sdf/d, что делает то же самое, что и :v/sdf/d - :g!, противоположное :g и идентично :v.

:help :v
:help :g

Ответ 4

Сортировка по второму столбцу, выбрав его в визуальном режиме (например, Control + v), затем запустите:

!sort

или сортировать по третьему столбцу

sort -k 3 

или

:sort /.*\%3v/

Альтернативно выберите строки, которые вы хотите сортировать, с помощью команды Shift + v. Затем введите

!sort -k 3n

или используйте приведенный ниже код, чтобы сообщить Vim пропустить первые два слова в каждой строке и отсортировать по следующему:

:%sort /^\S\+\s\+\S\+\s\+/ 

или, например, сортировать по 8-й строке:

:sort /.*\%55v/

"Виртуальная" спецификация - это абсолютное число столбцов, которое обрабатывает пробелы + вкладки как один символ (вкратце, он не учитывает вкладки как восемь пробелов),

поэтому сортировать по последнему столбцу:

:%sort /\<\S\+\>$/ r