Знайдіть шаблон з одного файлу, перерахованого в іншому


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 -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?

Під час налагодження цього питання я помітив кілька бродячих пробілів наприкінці 2-го рядка у файлі 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 Авторське право (C) 2009 Free Foundation Foundation, Inc. Ліцензія GPLv3 +: GNU GPL версії 3 або пізнішої < gnu.org/licenses/gpl.html > Це безкоштовне програмне забезпечення: ви можете змінювати і перерозподілити його. НЕМАЄ ГАРАНТІЇ в межах, дозволених законом. Я отримую відповідність лише в тому випадку, якщо вони існують як особи, а не так, як ви сказали. Як не дивно, єдиний матч, який я отримую, - це останній зразок з файлу, що містить відповідні шаблони.
Рон

1
Я вставив більш повну версію свого другого файлу, хоча і з меншими рядками, і спробував його шукати. Він не відповідає другому рядку з другого файлу
Рон

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.