2017-03-17 5 views
0

Mit AWK, um den Inhalt jeder Zeile in file mit $2 in list übereinstimmen. Beide Dateien sind durch Tabulatoren getrennte und es kann ein Raum oder ein Sonderzeichen im Namen in list angepasst sein wird, zum Beispiel in file der Name ist BRCA1 aber in list der Name ist BRCA 1 oder in file Name ist BCR aber in list der Name BCR/ABL.awk zum Drucken von Feldern, die unter Verwendung von Bedingungen und einem Standardwert für nicht übereinstimmen in zwei Dateien übereinstimmen

Wenn es eine Übereinstimmung und $4 von list ist, hat full gene sequence darin, dann $2 and $1 werden durch eine Lasche getrennt gedruckt. Wenn keine Übereinstimmung gefunden wird, wird der Name, der nicht übereinstimmte, und 14 getrennt durch eine Registerkarte gedruckt. Das awk unten wird ausgeführt, aber keine Ausgabeergebnisse. Vielen Dank :).

Datei

BRCA1 
BCR 
SCN1A 
fbn1 

Liste

List code gene gene name methodology 
81 DMD dystrophin deletion analysis and duplication analysis 
811 BRCA 1 BRCA2 full gene sequence and full deletion/duplication analysis 
70 ABL1 ABL1 gene analysis variants in the kinse domane 
71 BCR/ABL t(9;22) full gene sequence 

awk

awk -F'\t' -v OFS="\t" 'FNR==NR{A[$1]=$0;next} ($2 in A){if($4=="full gene sequence"){print A[$2],$1}} ELSE {print A[$2],"14"}' file list 

desir ed Ausgang

BRCA1 811 
BCR 71 
SCN1A 14 
fbn1  85 

bearbeiten

List code gene gene name methodology 
85 fbn1 Fibrillin full gene sequencing 
95 FBN1 fibrillin del/dup 

Ergebnis

85 fbn1 Fibrillin full gene sequencing 

da nur diese Linie hat full gene sequencing darin, nur diese gedruckt.

+1

Definieren Sie 'match': string oder regexp? teilweise oder voll? Groß-/Kleinschreibung beachten? Ohne diese Informationen erhalten Sie wahrscheinlich eine Lösung, die für einen bestimmten Test-Eingabe-Set funktioniert, aber 6 Monate später an Ihren echten Daten scheitert. Im Moment haben Sie zwei verschiedene Lösungen, die jeweils sehr unterschiedliche Annahmen darüber treffen, was Sie unter "Übereinstimmung" verstehen und die sich bei unterschiedlichen Input-Sets unterschiedlich verhalten, obwohl sie bei der von Ihnen bereitgestellten Beispieleingabe die gleiche Ausgabe liefern. –

+0

Übereinstimmung ist eine Zeichenfolge, die eine vollständige und ohne Berücksichtigung der Groß-/Kleinschreibung ist .... das ist "BRCA1" ist die Übereinstimmung, aber es könnte "brca1" oder "brca 1" sein.Außerdem habe ich gerade bemerkt, dass '$ 4' oder' vollständige Gensequenz' nicht enthalten ist und da es mehrere Einträge für die gleiche Übereinstimmung geben kann, macht es dies einzigartig. Ich habe auch ein Beispiel in die Post eingefügt. Vielen Dank :). – Chris

+0

Der Name in 'file' entspricht einer Zeichenkette in' $ 2' von 'list'. In 'list' kann der passende Name Teil der Zeichenkette sein, aber immer der vollständige Name aus' file'. Das ist der Name "BCR" entspricht der "$ 2" -String in "Liste", "BCR/ABL". Vielen Dank :). – Chris

Antwort

1

Sie können versuchen,

awk 'BEGIN{FS=OFS="\t"} 
FNR==NR{ 
    if(NR>1){ 
     gsub(" ","",$2)  #removing white space 
     n=split($2,v,"/") 
     d[v[1]] = $1   #from split, first element as key 
    } 
    next 
}{print $1, ($1 in d?d[$1]:14)}' list file 

erhalten,

 
BRCA1 811 
BCR 71 
SCN1A 14 
+0

Vielen Dank beide :). – Chris

1
awk 'FNR==NR{ 
      a[$2]=$1; 
      next 
     } 
    { 
     for(i in a){ 
      if($1 ~ i || i ~ $1){ print $1, a[i] ; next } 
     } 
     print $1,14 
    }' list file 

Eingang

$ cat list 
List code gene gene name methodology 
81 DMD dystrophin deletion analysis and duplication analysis 
811 BRCA 1 BRCA2 full gene sequence and full deletion/duplication analysis 
70 ABL1 ABL1 gene analysis variants in the kinse domane 
71 BCR/ABL t(9;22) full gene sequence 

$ cat file 
BRCA1 
BCR 
SCN1A 

Ausgabe

$ awk 'FNR==NR{ 
      a[$2]=$1; 
      next 
     } 
    { 
     for(i in a){ 
      if($1 ~ i || i ~ $1){ print $1, a[i] ; next } 
     } 
     print $1,14 
    }' list file 
BRCA1 811 
BCR 71 
SCN1A 14 
Verwandte Themen