Как сортировать по столбцу для строк, содержащих определенное слово
Я хочу сортировать по определенному столбцу только для строк, содержащих определенное слово. Я не хочу видеть строки, не содержащие этого слова. Например, у меня есть этот текстовый файл:
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