Finde Muster aus einer in einer anderen aufgelisteten Datei

15

Ich möchte Muster finden, die in einer Datei aufgelistet sind, und sie in einer anderen Datei finden. In der zweiten Datei werden diese Muster durch Kommas getrennt.

Zum Beispiel hat die erste Datei F1 Gene

ENSG00000187546
ENSG00000113492  
ENSG00000166971

und die zweite Datei F2 hat diese Gene zusammen mit einigen weiteren Spalten (fünf Spalten), die ich brauche

 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

Das Gen ENSG00000166971, das in der zweiten Datei enthalten ist, wird in grep nicht angezeigt, da es ein anderes Gen enthält, das durch Komma getrennt ist.

Mein Code ist:

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

Ich möchte diese Werte, auch wenn einer von ihnen vorhanden ist, und die damit verbundenen Daten. Gibt es eine Möglichkeit, dies zu tun?

Ron
quelle
1
Ist es möglich, dass Ihre Implementierung grepdie Muster standardmäßig verankert? Hat grep -f <(echo a) <(echo 'a,b')erzeugen eine Ausgabe?
Joseph R.

Antworten:

11

Welche Version von verwendest grepdu? Ich habe Ihren Code ausprobiert und die folgenden Ergebnisse erhalten:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Wenn Sie nur die übereinstimmenden Ergebnisse wünschen, können Sie mit grepdem -oSchalter nur die übereinstimmenden Elemente melden:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

grep version

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

Streuende Zeichen in F1.txt?

Beim weiteren Debuggen sind mir am Ende der 2. Zeile in der Datei mehrere Leerzeichen aufgefallen F1.txt. Sie können sie mit sehen 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

Sie zeigen sich mit als ASCII - Codes 20. Sie können sie in ihnen sehen hier: 32 20 20 0a.

slm
quelle
1
grep - Version GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. Lizenz GPLv3 +: GNU GPL Version 3 oder höher < gnu.org/licenses/gpl.html > Dies ist freie Software: Sie können Änderungen vornehmen und verteilen Sie es. Es wird keine Garantie übernommen, soweit dies gesetzlich zulässig ist. Ich erhalte die Übereinstimmungen nur, wenn sie als Einzelpersonen existieren und nicht, wie Sie sagten. Seltsamerweise ist die einzige Übereinstimmung, die ich erhalte, das letzte Muster aus der Datei, die die zu vergleichenden Muster enthält.
Ron
1
Ich habe eine vollständigere Version meiner zweiten Datei eingefügt, obwohl sie weniger Zeilen enthält, und habe versucht, danach zu suchen. Sie stimmt nicht mit der zweiten Zeile der zweiten Datei überein
Ron
1
@ Ron - Am Ende der Zeichenfolgen in der F1.txt-Datei befinden sich Sonderzeichen, die das Problem verursachen. Nur bestätigt, dass es gut funktioniert auf grep (GNU grep) 2.5.1
slm
1
Ich habe die Datei im Text Wrangler im Unix-LF-Format gespeichert und jetzt funktioniert es !!
Ron
2
@ Ron - ja der Spaß von Whitespace 8-)
slm