2015-05-18 5 views
5

quindi ho una lista di nomi di .txt geniche e ID sonda, OriginalFile.txt, in questo modo:Usando Unix/Bash, come posso creare una tabella di ricerca?

GENE_ID PROBE_ID 
10111 19873 
10112 284, 19983 
10113 187 

ci sono circa 30.000 righe di questo file di testo. Vorrei creare un nuovo file di testo senza virgole nella seconda colonna, come:

GENE_ID PROBE_ID 
10111 19873 
10112 284 
10112 19983 
10113 187 

... ma anche, voglio tutti i PROBE_IDs di venire da un altro file di testo, probes.txt, che si presenta come:

19873 
284 
187 

... in modo che io possa fare un file finalProduct.txt che assomiglia:

GENE_ID PROBE_ID 
10111 19873 
10112 284 
10113 187 

se volevo scrivere in ogni fila di probes.txt a mano, ho penso di poter ottenere questo risultato con qualcosa l ike:

awk -F"/t" '{for(i=1;i<=NF;i++){if ($i ~ /probeID#/){print $i}}}' myGenes > test.txt 

Ma, naturalmente, questo non metterebbe gli ID sonda virgola separati su righe diverse, e avrei inserire ciascuna delle migliaia di probeIDs mano.

Qualcuno ha suggerimenti o suggerimenti? Grazie!

EDIT PER CHIAREZZA
quindi penso che ci sono due passi in quello che sto chiedendo. Mi piacerebbe prendere originalFile.txt e alla fine produrre finalProduct.txt, usando probes.txt. Ci sono due passi in questo:

Per ogni sonda elencata in probe.txt, scoprire se esiste in originalFile.txt; se la sonda esiste, quindi stampa una linea che ha solo la sonda e il GENE_ID corrispondente.

o si potrebbe pensare ad esso come una sorta di join tra filtro su OriginalFile.txt utilizzando probes.txt, in cui il file di output ha la colonna PROBE_ID come le sonde in probes.txt e il corrispondente GENE_ID da fileoriginale. testo.

o si potrebbe pensare ad esso come: 1. Creare un file intermedio dove c'è una relazione molti-a-uno corrispondenza tra GENE_ID e PROBE_ID 2. Rimuovere tutte le righe di quel file intermedio dove il PROBE_ID non lo fa corrispondono a una voce in probes.txt

EDIT 2
attualmente cercando di riutilizzare this - nessun risultato ancora, ma forse collegamento sarà utile.

+0

Non è chiaro come si desidera far corrispondere le righe in probe.txt e righe su l'altro file (il primo). Inoltre, non è chiaro il motivo per cui l'estratto di finalProduct.txt non contenga due righe per il gene 10112 mentre sembra che gli id ​​di probe debbano andare in righe diverse in almeno due posizioni della domanda. – Diego

+0

Quindi vuoi dire che vuoi filtrare per gli ID probe trovati in 'probes.txt'? C'è solo una colonna lì, quindi non è quasi un join. –

+0

Spero che la mia modifica sia più chiara.10112 appare solo una volta in finalProduct.txt perché il PROBE_ID corrispondente da probes.txt viene visualizzato solo una volta. In originalFile.txt, GENE_ID = 10112 corrisponde a due ID PROBE_ID: 284 e 19983. Solo PROBE_ID = 284 viene visualizzato in probes.txt. Pertanto, in finalProduct.txt (in cui tutte le righe devono corrispondere a un probe in probes.txt), esiste una sola voce, ovvero la voce corrispondente a PROBE_ID = 284. –

risposta

3

Se probes.txt è abbastanza piccola che si adatta in memoria, si potrebbe provare il seguente awk script:

BEGIN { 
    OFS="\t"; 
    # this is to handle the given input that has spaces after the comma 
    # and tabs between gene and probes 
    FS="[\t, ]+"; 
    # load probes into an array 
    while ((getline probe < "probes.txt") > 0) { 
     probes[probe] = 1; 
    } 
    close ("probes.txt"); 
} 

{ 
    # for each probe, check if it's in the array 
    # and skip it if not 
    for (i=2; i <= NF; i++) { 
     if (probes[$i] == 1) { 
      print $1, $i; 
     } 
    } 
}