соответствуйте всего одной строке в двух файлах и возвратите целый столбец из файла 2

Проблема в том, что -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 может делать это по умолчанию.

-1
09.09.2014, 23:05
3 ответа

Использование 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
0
28.01.2020, 05:13

Чтобы соответствовать номеру, вы можете использовать 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.  
0
28.01.2020, 05:13

Используйте 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
0
28.01.2020, 05:13

Теги

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