2010-09-16 5 views
3

J'essaie de combiner deux listes, les rejoignant par un champ commun tel que ENST00000371026. J'ai essayé le suivant mais pas de chance. Quelle est la manière réelle de le faire?combiner deux listes avec une jointure sur une colonne

cat> gar1.txt <<EOF 
ENST00000371026 ENSG00000152763 
ENST00000371023 ENSG00000152763 
ENST00000395250 ENSG00000152763 
ENST00000309502 ENSG00000163485 
ENST00000377464 ENSG00000142599 
ENST00000400908 ENSG00000142599 
ENST00000337907 ENSG00000142599 
ENST00000400907 ENSG00000142599 
ENST00000401087 ENSG00000179571 
EOF 

cat> gar2.txt <<EOF 
DDX11L1 ENST00000371026 
DDX11L9 ENST00000309502 
DDX11L1 ENST00000371026 
OR4F5 ENST00000377464 
DQ597235  n/a 
DQ599768  n/a 
LOC388312  ENST00000401087 
LOC100132287 ENST00000425496 
LOC100132287 ENST00000425496 
EOF 

join -t"\t" -2 2 -1 1 gar1.txt gar2.txt 

Un exemple de sortie serait:

DDX11L1 ENSG00000152763 
DDX11L9 ENSG00000163485 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 NONE 
+0

Combinez-les comment? Des lignes alternées? Prenez les colonnes de gar2.txt et ajoutez chaque ligne au premier fichier? – zigdon

+0

Je voudrais utiliser gar1 comme index. Remplacez ensuite les valeurs ENST dans gar2 par ENSG et affichez une liste de valeurs ENSG uniques avec le champ correspondant 1 de gar2.txt –

+0

Voir ma réponse éditée. (Je l'ai répété ici car je ne sais pas si l'adressage @ fonctionnera avec votre nom d'utilisateur court.) –

Répondre

3

pour cette solution:

join -a 2 -t $'\t' -2 2 -1 1 -o 2.1 1.2 <(sort gar1.txt) <(sort -k 2,2 gar2.txt) | sed '/\t$/ s/$/NONE/' | uniq 

Il utilise la substitution de processus Bash (<()), mais vous pouvez tout simplement pré-trier vos fichiers si vous Je ne veux pas utiliser ça. Votre version de join doit avoir l'option -o ou vous pouvez utiliser awk pour traiter la sortie plus loin. Pour les « n/a » lignes, il affiche « NONE », mais vous pouvez le faire pour les éliminer:

<(sort -k 2,2 gar2.txt | grep -v 'n/a$') 

Edit:

Ceci est la sortie que je reçois sans sed et uniq :

DDX11L9 ENSG00000163485 
DDX11L1 ENSG00000152763 
DDX11L1 ENSG00000152763 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 
LOC100132287 
DQ597235 
DQ599768 

Et voici ce que je reçois avec eux:

DDX11L9 ENSG00000163485 
DDX11L1 ENSG00000152763 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 NONE 
DQ597235  NONE 
DQ599768  NONE 

Ajout du grep:

DDX11L9 ENSG00000163485 
DDX11L1 ENSG00000152763 
OR4F5 ENSG00000142599 
LOC388312  ENSG00000179571 
LOC100132287 NONE 

qui correspond à votre exemple de sortie à l'exception de l'ordre. Si vous avez besoin de conserver l'ordre, il serait possible de le faire.

+0

+ 1 utile, cependant joindre -a 2 -t $ '\ t' -2 2 -1 1 -o 2.1 1.2 <(trier gar1.txt) <(trier -k 2,2 gar2.txt) semble produire un fichier gar2.txt trié plutôt que la sortie attendue. Cela a-t-il fonctionné pour vous pour les fichiers d'exemple? –

+0

@D W: Voir mes modifications. –

+0

Je faisais une bêtise. Le script fonctionne très bien! –

Questions connexes