Znajdź wzór z jednego pliku wymienionego w innym

15

Chcę znaleźć wzorce, które są wymienione w jednym pliku i znaleźć je w innym pliku. Drugi plik ma te wzorce oddzielone przecinkami.

na przykład pierwszy plik F1 ma geny

ENSG00000187546
ENSG00000113492  
ENSG00000166971

a drugi plik F2 ma te geny wraz z kilkoma dodatkowymi kolumnami (pięcioma kolumnami), których potrzebuję

 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

Zatem gen ENSG00000166971, który jest obecny w drugim pliku, nie pojawia się w grep, ponieważ ma z nim inny gen, oddzielony przecinkiem.

Mój kod to:

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

Chcę te wartości, nawet jeśli jedna z nich jest obecna, i powiązane z nią dane. Czy jest jakiś sposób, aby to zrobić?

Ron
źródło
1
Czy to możliwe, że twoja implementacja grepdomyślnie zakotwicza swoje wzorce? Czy grep -f <(echo a) <(echo 'a,b')produkuje jakąkolwiek produkcję?
Joseph R.

Odpowiedzi:

11

Jakiej wersji grepużywasz? Wypróbowałem Twój kod i uzyskałem następujące wyniki:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Jeśli chcesz po prostu wyników pasujących można użyć grep„s -oprzełącznik zgłosić tylko te rzeczy, które mecze:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

wersja 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>.

Zbłąkane postacie w F1.txt?

Podczas dalszego debugowania zauważyłem kilka zbłąkanych spacji na końcu drugiej linii w pliku F1.txt. Możesz je zobaczyć za pomocą 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

Pokazują one, jak się z kodów ASCII 20. Można je zobaczyć w nich tutaj: 32 20 20 0a.

slm
źródło
1
grep --version GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. Licencja GPLv3 +: GNU GPL wersja 3 lub nowsza < gnu.org/licenses/gpl.html > To jest wolne oprogramowanie: możesz zmieniać i rozpowszechnij to. Nie ma ŻADNEJ GWARANCJI, w zakresie dozwolonym przez prawo. Dostaję dopasowania tylko wtedy, gdy istnieją one osobno, a nie tak, jak powiedziałeś. Co dziwne, jedynym dopasowaniem, jaki otrzymuję, jest ostatni wzorzec z pliku zawierającego wzorce, które mają zostać dopasowane.
Ron
1
Wkleiłem bardziej kompletną wersję mojego drugiego pliku, chociaż z mniejszą liczbą wierszy, i próbowałem go wyszukać. Nie pasuje on do drugiego wiersza z drugiego pliku
Ron
1
@Ron - masz zbłąkane znaki na końcu ciągów w pliku F1.txt, który powoduje problem. Właśnie potwierdziłem, że działa dobrze na grep (GNU grep) 2.5.1
slm
1
Właśnie zapisałem plik w tekście wrangler w formacie Unix-LF, a teraz działa !!
Ron
2
@Ron - tak, zabawa w białe spacje 8-)
slm