Найти шаблон из одного файла, указанного в другом


15

Я хочу найти шаблоны, которые перечислены в одном файле и найти их в другом файле. Во втором файле эти шаблоны разделены запятыми.

например, у первого файла F1 есть гены

ENSG00000187546
ENSG00000113492  
ENSG00000166971

и второй файл F2 имеет те гены наряду с еще несколькими столбцами (пять столбцов), которые мне нужны

 region     gene           chromosome  start       end

 intronic   ENSG00000135870 1   173921301   173921301
intergenic  ENSG00000166971(dist=56181),ENSG00000103494(dist=37091) 16 53594504    53594504
ncRNA_intronic  ENSG00000215231 5   5039185 5039185
intronic    ENSG00000157890 15  66353740    66353740

Таким образом, ген ENSG00000166971, который присутствует во втором файле, не отображается в grep, поскольку у него есть другой ген, разделенный запятой.

Мой код:

grep -f "F1.txt" "F2.txt" >output.txt

Я хочу эти значения, даже если одно из них присутствует, и связанные с ним данные. Есть ли способ сделать это?


1
Возможно ли, что ваша реализация grepпривязывает свои шаблоны по умолчанию? grep -f <(echo a) <(echo 'a,b')Производит ли какой-либо вывод?
Джозеф Р.

Ответы:


11

Какую версию grepвы используете? Я попробовал ваш код и получил следующие результаты:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Если вы просто хотите , чтобы результаты , которые соответствуют вы можете использовать grep«S -oпереключатель , чтобы сообщить только то , что матч:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

версия grep

$ grep --version
grep (GNU grep) 2.14
Copyright (C) 2012 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others, see <http://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

Бродячие символы в F1.txt?

При дальнейшей отладке я заметил несколько случайных пробелов в конце второй строки файла F1.txt. Вы можете увидеть их, используя hexdump.

$ hexdump -C ff1
00000000  45 4e 53 47 30 30 30 30  30 31 38 37 35 34 36 0a  |ENSG00000187546.|
00000010  45 4e 53 47 30 30 30 30  30 31 31 33 34 39 32 20  |ENSG00000113492 |
00000020  20 0a 45 4e 53 47 30 30  30 30 30 31 36 36 39 37  | .ENSG0000016697|
00000030  31 0a                                             |1.|
00000032

Они показывают , как с ASCII коды 20. Вы можете увидеть их в них: 32 20 20 0a.


1
grep --version GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. Лицензия GPLv3 +: GNU GPL версии 3 или более поздней версии < gnu.org/licenses/gpl.html > Это бесплатное программное обеспечение: вы можете вносить изменения и распространять его. НЕ ПРЕДОСТАВЛЯЕТСЯ ГАРАНТИИ, если это разрешено законом. Я получаю совпадения только в том случае, если они существуют как отдельные лица, а не так, как вы сказали. Как ни странно, единственное совпадение, которое я получаю, - это последний шаблон из файла, содержащий шаблоны для сопоставления.
Рон

1
Я вставил более полную версию моего второго файла, хотя и с меньшим количеством строк, и попытался найти его. Он не соответствует второй строке второго файла
Ron

1
@Ron - в конце строки в файле F1.txt, из-за которой возникают проблемы, есть случайные символы. Только что подтвердил, что работает нормально на grep (GNU grep) 2.5.1
slm

1
Я только что сохранил файл в текстовом редакторе в формате Unix-LF, и теперь он работает !!
Рон

2
@Ron - да, веселье из пробелов 8-)
slm
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.