2017-09-21 1 views
0

En résumé, j'ai deux fichiers TAB comme décrit ci-dessous.Puis-je effectuer un hachage par Unix dans lequel pour chaque ligne dans une colonne imprimer toutes les coïncidences correspondant à l'autre colonne dans l'autre fichier de l'onglet

Input1.tsv

34167 305603 S568 phosphorylation S  568 
99024 179102 T170 Glycosylation T  170              
99025 179102 Y182 phosphorylation Y  182              
74300 105800 S632 phosphorylation S  632              
41095 105800 S748 phosphorylation S  748              
41096 105800 S778 acethylation S  778 

et Input2.tsv

179102 FUCA1 NM_000147.4 NP_000138.2 
179102 FUCA1 XM_005245821.2 XP_005245878.1 
179102 FUCA1 XM_011541167.2 XP_011539469.1 
179102 FUCA1 XM_017000905.1 XP_016856394.1 
357819 AGT  NM_000029.3  NP_000020.1 
105800 INPP5B NM_001297434.1 NP_001284363.1 
105800 INPP5B NM_001297434.1 NP_001284363.1 

sortie souhaitée

179102 FUCA1 NM_000147.4 NP_000138.2 Glycosylation T  170 phosphorylation Y  182 
179102 FUCA1 XM_005245821.2 XP_005245878.1 Glycosylation T  170 phosphorylation Y  182 
179102 FUCA1 XM_011541167.2 XP_011539469.1 Glycosylation T  170 phosphorylation Y  182 
179102 FUCA1 XM_017000905.1 XP_016856394.1 Glycosylation T  170 phosphorylation Y  182 
357819 AGT  NM_000029.3  NP_000020.1 
105800 INPP5B NM_001297434.1 NP_001284363.1 phosphorylation S  748 phosphorylation S  748 acethylation S  778 
105800 INPP5B NM_001297434.1 NP_001284363.1 phosphorylation S  748 phosphorylation S  748 acethylation S  778 

Je voudrais faire un hachage afin de relier chaque coïncidence dans la deuxième colonne pour chaque ligne du premier fichier à la première colonne du deuxième fichier et imprimer le deuxième fichier et toutes les coïncidences du premier fichier pour la veille rangée. Je suis en train de faire un hachage comme

awk 'BEGIN {FS=OFS="\t"} NR==FNR {h[$2]=$4"\t"$5"\t"$6; next} {print $0,h[$1]}' "input1" "input2" > "output"; 

L'inconvénient est que je pense que l'impression que la première coïncidence trouvée dans premier fichier, mais pas tous. Ainsi, toutes les coïncidences liées au premier fichier ne sont pas enregistrées dans le fichier de sortie. Y at-il une possibilité de faire dans l'environnement Unix afin d'obtenir la sortie désirée? Merci à l'avance

Répondre

4

Modifier votre commande comme suit,

awk 'BEGIN {OFS="\t"} NR==FNR{h[$2]=h[$2] OFS $4 OFS $5 OFS $6;next} {print $0,h[$1]}' Input1.tsv Input2.tsv 

Cela devrait obtenir ce que vous souhaitez.

partie modifiée:

  • h[$2]=h[$2] OFS $4 OFS $5 OFS $6: ajouter le cas apparié derrière h[$2]
+0

Merci @CWLiu. Apparemment, cela fonctionne correctement! –

+1

Oui, @EdMorton, très bon point, je vais le modifier comme les suggestions. – CWLiu

+0

Vous avez raison @EdMorton. Merci encore! –