2016-03-23 8 views
1

Ich versuche, in $ 1 von file1 und legen Sie den Inhalt $2 in dieser Datei in $4 von file2 von einem | getrennt $4 in file2 mit einer partiellen Zeichenfolge übereinstimmen. Das Problem, das ich habe, ist, dass in file2 die Zeichenfolge in $4 wie ADH5_1 aussieht und seine Übereinstimmung in file1$1 aussieht wie 426_238486_128(ADH5)_1_1. Ich bin mir nicht sicher, wie ich das am besten angehen soll. Vielen Dank :).teilweise Übereinstimmung zwischen Dateien awk mit

file1

426_238486_128(ADH5)_1_1 70 
426_238487_128(ADH5)_2_1 50.83 
426_238488_128(ADH5)_3.1_1 46.67 

file2

chr4 100009839 100009851 ADH5_1 
chr4 100006265 100006367 ADH5_2 
chr4 100003125 100003267 ADH5_3 

gewünschte Ausgangs

chr4 100009839 100009851 ADH5_1|70 
chr4 100006265 100006367 ADH5_2|50.83 
chr4 100003125 100003267 ADH5_3|46.67 

Ich weiß, dass eine teilweise matc h in awk kann getan werden, aber nicht sicher, wie es für eine ganze Datei statt ein Schlüsselwort zu tun und auch, wie die Zeichenfolge formatiert wird, so dass es richtig durchsucht werden kann.

awk '$1 ~ /AGRN_1/ { print }' file1 

Antwort

1
$ awk -v OFS='|' 'NR==FNR{split($1,t,/[_().]+/); a[t[4]"_"t[5]]=$NF; next} {print $0, a[$NF]}' file1 file2 
chr4 100009839 100009851 ADH5_1|70 
chr4 100006265 100006367 ADH5_2|50.83 
chr4 100003125 100003267 ADH5_3|46.67 
+1

Vielen Dank, funktioniert super :). – Chris

1

Sie können ein awk-Skript wie folgt verwenden (getestet mit GNU Awk):

FNR==NR { # file 1 
    # extract key from $1 
    k = gensub(/^.*\(([^)]+)\)_([0-9]+).*$/, "\\1_\\2", 1, $1) 
    m[ k ] = $2 # store value $2 from file1 
    next # line (of file1) 
    } 

    # file2 
    { 
    print $0 "|" m[$4] 
    } 

es wie folgt verwendet:

awk -f script.awk file1 file2 

Der erste Block nach FNR==NR für die Ausführung erste Datei, die next sorgt dafür, dass der zweite Block für die erste Datei nicht erreicht wird. Dieser Block berechnet einen Schlüssel (im Format der zweiten Datei) und speichert den Wert unter dem Schlüssel.

Der zweite Block wird nur für die zweite Datei ausgeführt, er sucht den Wert und gibt die gewünschte Zeile aus.

1

awk zur Rettung!

die Klammer entfernen und für ein Spiel schauen Begrenzer

$ awk 'NR==FNR{sub(/\(/,"");sub(/\)/,""); a[$1]=$2; next} 
    {for(k in a) {if(k~$4) {print $0, a[k]; next}}}' file1 file2 

chr4 100009839 100009851 ADH5_1 70 
chr4 100006265 100006367 ADH5_2 50.83 
chr4 100003125 100003267 ADH5_3 46.67 

für Rohr, Set -v OFS='|'

Verwandte Themen