Trova lo schema da un file elencato in un altro


15

Voglio trovare modelli elencati in un file e trovarli in un altro file. Il secondo file ha quei modelli separati da virgole.

per esempio il primo file F1 ha dei geni

ENSG00000187546
ENSG00000113492  
ENSG00000166971

e il secondo file F2 ha quei geni insieme ad alcune altre colonne (cinque colonne) di cui ho bisogno

 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

Quindi il gene ENSG00000166971, che è presente nel secondo file, non appare in grep perché ha un altro gene con esso, separato da una virgola.

Il mio codice è:

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

Voglio quei valori anche se uno è presente e i dati ad esso associati. Esiste un modo per farlo?


1
È possibile che la tua implementazione di grepancore i suoi schemi di default? Non grep -f <(echo a) <(echo 'a,b')produce alcun output?
Joseph R.,

Risposte:


11

Quale versione di grepstai usando? Ho provato il tuo codice e ho ottenuto i seguenti risultati:

$ grep -f file1 file2
ENSG00000187546
ENSG00000113492
ENSG00000166971,ENSG00000186106

Se desideri solo i risultati corrispondenti, puoi utilizzare grepl' -oopzione per segnalare solo gli elementi corrispondenti:

$ grep -o -f file1 file2 
ENSG00000187546
ENSG00000113492
ENSG00000166971

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

Personaggi randagi in F1.txt?

Durante il debug di questo ulteriore ho notato diversi spazi randagi alla fine della 2a riga nel file F1.txt. Puoi vederli 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

Essi mostrano con i codici ASCII 20. Potete vederli in loro qui: 32 20 20 0a.


1
grep --version GNU grep 2.6.3 Copyright (C) 2009 Free Software Foundation, Inc. Licenza GPLv3 +: GNU GPL versione 3 o successiva < gnu.org/licenses/gpl.html > Questo è un software gratuito: sei libero di cambiare e ridistribuirlo. Non esiste alcuna GARANZIA, nella misura consentita dalla legge. Ricevo le partite solo se esistono come individui e non come hai detto. Stranamente, l'unica corrispondenza che sto ricevendo è l'ultimo modello dal file contenente gli schemi da abbinare.
Ron,

1
Ho incollato la versione più completa del mio secondo file anche se con meno righe e ho provato a cercarlo. Non corrisponde alla seconda riga dal secondo file
Ron,

1
@ Ron - Hai caratteri vaganti alla fine delle stringhe nel file F1.txt che sta causando il tuo problema. Ho appena confermato che funziona bene su grep (GNU grep) 2.5.1
slm

1
Ho appena salvato il file in wrangler di testo in formato Unix-LF, e ora funziona !!
Ron,

2
@Ron - sì il divertimento di spazi bianchi 8-)
SLM
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.