Encontrar padrão de um arquivo listado em outro


15

Quero encontrar padrões listados em um arquivo e encontrá-los em outro arquivo. O segundo arquivo possui esses padrões separados por vírgulas.

por exemplo, o primeiro arquivo F1 tem genes

ENSG00000187546
ENSG00000113492  
ENSG00000166971

e o segundo arquivo F2 tem esses genes junto com mais algumas colunas (cinco colunas) que eu preciso

 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

Portanto, o gene ENSG00000166971, presente no segundo arquivo, não aparece no grep porque possui outro gene, separado por vírgula.

Meu código é:

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

Eu quero esses valores mesmo se um deles estiver presente e os dados associados a ele. Existe alguma maneira de fazer isso?


1
É possível que sua implementação de grepancore seus padrões por padrão? Não grep -f <(echo a) <(echo 'a,b')produz nenhuma saída?
Joseph R.

Respostas:


11

Qual versão grepvocê está usando? Eu tentei seu código e obtive os seguintes resultados:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Se você deseja apenas os resultados correspondentes, use grepa -oopção 's' para informar apenas os itens correspondentes:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

versão 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>.

Caracteres dispersos em F1.txt?

Durante a depuração, notei vários espaços dispersos no final da 2ª linha do arquivo F1.txt. Você pode vê-los 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

Eles aparecem com como códigos ASCII 20. Você pode vê-los neles aqui: 32 20 20 0a.


1
grep --version GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. Licença GPLv3 +: GNU GPL versão 3 ou posterior < gnu.org/licenses/gpl.html > Este é um software gratuito: você pode mudar e redistribuí-lo. NÃO HÁ GARANTIA, na extensão permitida por lei. Só estou obtendo as correspondências se elas existirem como indivíduos e não como você disse. Estranhamente, a única correspondência que estou obtendo é o último padrão do arquivo que contém os padrões a serem correspondidos.
Ron

1
Eu ter colado versão mais completa do meu segundo arquivo, embora com menos linhas, e tentei procurar it.It não coincide com a segunda fila de segundo arquivo
Ron

1
@Ron - Você tem caracteres perdidos no final das seqüências no arquivo F1.txt que está causando o problema. Acabei de confirmar que funciona bem no grep (GNU grep) 2.5.1
slm

1
Acabei de salvar o arquivo no texto wrangler no formato Unix-LF, e agora funciona!
Ron

2
@Ron - sim, a diversão do espaço em branco 8-)
slm
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.