Завершение Bash - Как получить завершение имени файла для подопций

Соединение + вид

При попытке найти IP, которые присутствуют в обоих, можно использовать join команда, но необходимо будет использовать sort предварительно отсортировать файлы до присоединения к ним.

$ join -o 2.2 <(sort file1) <(sort file2)

Пример

$ join -o 2.2 <(sort file1) <(sort file2)
1.765
0.326
4.754
3.673
6.334

Другой пример

файл 1a:

$ cat file1a
34.123.21.32
45.231.43.21
21.34.67.98
1.2.3.4
5.6.7.8
9.10.11.12

файл 2a:

$ cat file2a
34.123.21.32 0.326 - [30/Oct/2013:06:00:06 +0200]
45.231.43.21 6.334 - [30/Oct/2013:06:00:06 +0200]
45.231.43.21  3.673 - [30/Oct/2013:06:00:06 +0200]
34.123.21.32 4.754 - [30/Oct/2013:06:00:06 +0200]
21.34.67.98 1.765 - [30/Oct/2013:06:00:06 +0200]
1.2.3.4 1.234 - [30/Oct/2013:06:00:06 +0200]
4.3.2.1 4.321 - [30/Oct/2013:06:00:06 +0200]

Выполнение join команда:

$ join -o 2.2 <(sort file1) <(sort file2)
1.234
1.765
0.326
4.754
3.673
6.334

Примечание: Первоначальный заказ file2 потерян с этим методом, вследствие того, что мы отсортировали его сначала. Однако этот метод только должен просканировать file2 единственное время теперь, в результате.

grep

Можно использовать grep искать соответствия в file2 использование выравнивает, которые находятся в file1, но этот способ не так эффективен как первый метод, который я показал Вам. Это сканирует file2 поиск каждой строки в file1.

$ grep -f file1 file2 | awk '{print $2}'

Пример

$ grep -f file1 file2 | awk '{print $2}'
0.326
6.334
3.673
4.754
1.765
1.234

Улучшающий производительности grep

Можно убыстриться grepпроизводительность при помощи этой формы:

$ LC_ALL=C grep -f file1 file2 | awk '{print $2}'

Можно также сказать grep то, что жала в file1 фиксированная длина (-F) который также поможет в выполнении улучшения.

$ LC_ALL=C grep -Ff file1 file2 | awk '{print $2}'

Обычно в программном обеспечении, Вы стараетесь не иметь необходимость сделать этот подход, хотя, так как это - в основном цикл в типе цикла решения. Но существуют времена, когда лучше, чтобы мог быть достигнут с помощью компьютера + программное обеспечение.

Ссылки

3
13.04.2015, 09:57
1 ответ

Я не думаю, что есть какая-либо встроенная или бэш-функция для заполнения только голых имён файлов. Директории могут содержать файлы, поэтому стандартным поведением при заполнении имени файла является заполнение файлов и директорий (как это делает функция bash-завершения _fileir). Он имеет опцию только для каталогов, но не только для файлов).

Можно написать пользовательскую функцию для возврата только голых совпадений имен файлов, например, итерацию по completions=("$word "* ) и проверку [[ -f "$i"]] для сборки COMPREPLY.

Я прочитал ваш код более внимательно. Если вы генерируете завершения для mpv, вы не должны ограничивать его только работой с голыми именами файлов в текущем каталоге. Так себя ведет любая другая функция пользовательского завершения, о которой я знаю.

0
27.01.2020, 21:41

Теги

Похожие вопросы