Проблема в том, что -R
указывает grep
на рекурсивный поиск по всем файлам в каталоге. Таким образом, вы не можете комбинировать его с определенной группой файлов. Поэтому вы можете использовать find
по предложению @KM. , или shell globbing:
$ shopt -s globstar
$ grep -- "->-" **/*.tex
Команда shopt
активирует функцию bash's globstar:
globstar
If set, the pattern ** used in a pathname expansion con‐
text will match all files and zero or more directories
and subdirectories. If the pattern is followed by a /,
only directories and subdirectories match.
Затем вы даете **/*.tex
в качестве шаблона, который будет соответствовать всем файлам .tex
в текущем каталоге и любых подкаталогах.
Если вы используете zsh
, то нет необходимости в shopt
(что в любом случае является функцией bash), так как zsh
может делать это по умолчанию.
Использование Exep
должно помочь. Попробуй:
Greep -e '(905894 | 1197693 | 3703749 | 92108275 | 114940633)' file2
Это проверит наличие рисунка, предусмотренного в file1
. При тестировании, я получил это для результатов:
[rkahil@xxxxxx ~]$ grep -E '(905894|1197693|3703749|92108275|114940633)' file2
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
Чтобы соответствовать номеру, вы можете использовать GREP RETERN ROW:
$ grep 883625 file2
1 mapping 883625 SNV 1 A G Homozygous 23
Если вы хотите выводить все линии в File2
, которые имеют номера в File1
:
$ grep -f file1 file2
Mapping Reference Position Type Length Reference Allele Linkage Zygosity Count
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
т.е. Вариант -F
-F GreeP сканирует ваш file1
и пытается найти совпадения в file2
. Здесь также заголовок соответствует первой строке в File1
. Из Человек Греп
:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file
contains zero patterns, and therefore matches nothing.
grep
для чтения шаблонов из файла В файле 1
в качестве шаблонов с фиксированными стингами - опция -F
говорит grep
, чтобы не интерпретировать шаблоны как регеспирированные.
Grep имеет опцию -f
для чтения деталей для файла, по одной детали в каждой линии. Это как раз то, что у нас есть, так что шаблоны можно читать непосредственно из файла.
$ grep -F -f file1 file2
Mapping Reference Position Type Length Reference Allele Linkage Zygosity Count
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
В команде выше используются шаблоны из файла1
, например, 905894
. Если бы в файле 2
была строка, содержащая 9058940
, то совпала бы 905894
, так как она совпадает с первыми шестью символами. Это неправильно. Поэтому нам нужно, чтобы он совпадал только с целыми словами. Мы могли бы изменить шаблоны, чтобы они совпадали с началом и концом слова, например '\b905894\b'
, но grep
имеет опцию для этого общего случая: -w
:
grep -F -w -f file1 file2
Нам не нужны заголовки, хотя технически правильно, что они показаны, так как заголовок Reference Position
встречается в обоих файлах.
С помощью tail -n +2
мы выбираем строки, начинающиеся со второй, и используем -
в качестве имени файла для чтения вывода tail
из stdin:
$ tail -n +2 file1 | grep -F -w -f - file2
1 mapping 905894 SNV 1 C T Heterozygous 41
1 mapping 1197693 SNV 1 G A Heterozygous 23
In bash, это делает примерно то же самое:
grep -F -w -f <(tail -n +2 file1) file2