Rechercher un modèle dans un fichier répertorié dans un autre


15

Je veux trouver des modèles répertoriés dans un fichier et les trouver dans un autre fichier. Le deuxième fichier a ces modèles séparés par des virgules.

par exemple, le premier fichier F1 contient des gènes

ENSG00000187546
ENSG00000113492  
ENSG00000166971

et le deuxième fichier F2 contient ces gènes ainsi que d'autres colonnes (cinq colonnes) dont j'ai besoin

 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

Le gène ENSG00000166971 qui est présent dans le deuxième fichier n'apparaît donc pas dans grep car il contient un autre gène, séparé par une virgule.

Mon code est:

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

Je veux ces valeurs même si l'une d'entre elles est présente et les données associées. Y a-t-il un moyen de le faire?


1
Est-il possible que votre implémentation d' grepancre ses patterns par défaut? Produit-il grep -f <(echo a) <(echo 'a,b')une sortie?
Joseph R.

Réponses:


11

Quelle version greputilisez-vous? J'ai essayé votre code et obtenu les résultats suivants:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Si vous voulez juste que les résultats correspondent, vous pouvez utiliser greple -ocommutateur de pour signaler uniquement les éléments qui correspondent:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

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

Des personnages errants dans F1.txt?

Lors du débogage, j'ai remarqué plusieurs espaces parasites à la fin de la 2e ligne du fichier F1.txt. Vous pouvez les voir en utilisant 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

Ils apparaissent avec des codes ASCII 20. Vous pouvez les voir en eux ici: 32 20 20 0a.


1
grep --version GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. Licence GPLv3 +: GNU GPL version 3 ou ultérieure < gnu.org/licenses/gpl.html > Ceci est un logiciel gratuit: vous êtes libre de changer et le redistribuer. Il n'y a AUCUNE GARANTIE, dans la mesure permise par la loi. Je ne reçois les correspondances que si elles existent en tant qu'individus et non comme vous l'avez dit. Étrangement, la seule correspondance que j'obtiens est le dernier motif du fichier contenant les motifs à faire correspondre.
Ron

1
J'ai collé une version plus complète de mon deuxième fichier mais avec moins de lignes, et j'ai essayé de le rechercher.Il ne correspond pas à la deuxième ligne du deuxième fichier
Ron

1
@Ron - Vous avez des caractères parasites à la fin des chaînes dans le fichier F1.txt à l'origine de votre problème. Je viens de confirmer que cela fonctionne bien sur grep (GNU grep) 2.5.1
slm

1
Je viens d'enregistrer le fichier au format wrangler au format Unix-LF, et maintenant ça marche !!
Ron

2
@Ron - oui le plaisir des espaces 8-)
slm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.