Encuentra el patrón de un archivo listado en otro

15

Quiero encontrar patrones que se enumeran en un archivo y encontrarlos en otro archivo. El segundo archivo tiene esos patrones separados por comas.

por ejemplo, el primer archivo F1 tiene genes

ENSG00000187546
ENSG00000113492  
ENSG00000166971

y el segundo archivo F2 tiene esos genes junto con algunas columnas más (cinco columnas) que necesito

 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

Entonces, el gen ENSG00000166971 que está presente en el segundo archivo no aparece en grep porque tiene otro gen, separado por comas.

Mi código es:

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

Quiero esos valores incluso si uno de ellos está presente, y los datos asociados con él. ¿Hay alguna forma de hacerlo?

Ron
fuente
1
¿Es posible que su implementación de grepanclaje sus patrones por defecto? ¿ grep -f <(echo a) <(echo 'a,b')Produce alguna salida?
Joseph R.

Respuestas:

11

¿Qué versión de grepestás usando? Probé su código y obtuve los siguientes resultados:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Si solo desea que los resultados coincidan, puede usar grepel -ointerruptor para informar solo las cosas que coinciden:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

versión 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>.

Personajes extraviados en F1.txt?

Mientras lo depuraba más, noté varios espacios perdidos al final de la segunda línea del archivo F1.txt. Puedes verlos usando 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

Se presentan con los códigos ASCII 20. Se los puede ver en ellos aquí: 32 20 20 0a.

slm
fuente
1
grep --version GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. Licencia GPLv3 +: GNU GPL versión 3 o posterior < gnu.org/licenses/gpl.html > Este es un software gratuito: puede cambiarlo libremente y redistribuirlo. NO HAY GARANTÍA, en la medida permitida por la ley. Solo obtengo las coincidencias si existen como individuos y no como dijiste. Curiosamente, la única coincidencia que obtengo es el último patrón del archivo que contiene los patrones que deben coincidir.
Ron
1
Pegué una versión más completa de mi segundo archivo, aunque con menos filas, e intenté buscarlo. No coincide con la segunda fila del segundo archivo
Ron
1
@Ron: tiene caracteres extraviados al final de las cadenas en el archivo F1.txt que está causando el problema. Acabo de confirmar que funciona bien en grep (GNU grep) 2.5.1
slm
1
Acabo de guardar el archivo en texto wrangler en formato Unix-LF, ¡y ahora funciona!
Ron
2
@Ron - sí, la diversión del espacio en blanco 8-)
slm