2016-05-13 5 views
2

Ich habe zwei Textdateien:Linux - Suchen Text in einer Datei und kommen in einer anderen Datei

File-1:

PRKCZ 
TNFRSF14 
PRDM16 
MTHFR 

File-2 (enthält zwei Registerkarten Spalten getrennt):

atherosclerosis GRAB1|PRKCZ|TTN 
cardiomyopathy,hypercholesterolemia PRKCZ|MTHFR 
Pulmonary arterial hypertension,arrhythmia PRDM16|APOE|GATA4 

Nun, für jeden Namen in File-1, drucken Sie auch die entsprechenden Krankheiten Namen von File-2, wo es übereinstimmt. So würde der Ausgang sein:

PRKCZ atherosclerosis,cardiomyopathy,hypercholesterolemia 
PRDM16 Pulmonary arterial hypertension,arrhythmia 
MTHFR cardiomyopathy,hypercholesterolemia 

ich den Code versucht:

$ awk '{k=$1} 
     NR==FNR{if(NR>1)a[k]=","b"="$1";else{a[k]="";b=$1}next} 
     k in a{print $0a[k]}' File1 File2 

aber ich erhielt keine gewünschte Ausgabe. Kann jemand bitte korrigieren/helfen.

Antwort

3

Sie können dies mit folgendem awk-Skript:

script.awk

BEGIN { FS="[\t]" } 
NR==FNR { split($2, tmp, "|") 
      for(ind in tmp) { 
      name = tmp[ ind ] 
      if (name in disease) { disease[ name ] = disease[ name ] "," $1 } 
      else { disease[ name ] = $1 } 
      } 
      next 
     } 

     { if($1 in disease) print $1, disease[ $1 ] } 

es wie dieses awk -f script.awk File-2 File-1 (beachten Sie zuerst File-2) Verwendung.

Erläuterung:

  • der BEGIN Block setzt Register als Trenn auf.
  • der NR == FNR Block für das erste Argument ausgeführt (File-2): liest die Krankheiten mit den Namen, teilt die Namen und fügt dann die Krankheit zu einem Wörterbuch unter jedem des Namen
  • der letzte Block nur dann ausgeführt wird (aufgrund der next in dem vorherigen Block) für das zweite Argument (File-1): es ist die Krankheiten ausgibt, die
unter dem Namen gespeichert sind (aus $1)
Verwandte Themen