2016-04-04 9 views
1

$4の値を$5のテキストと-の前に出力し、一致の平均値を$7に出力しようとしています。出力はソートされ、一致する$5文字列がグループ化されます。 awkは近いですが、出力が空で、おそらくもっと良い方法がありますが、うまくいけば始まりです:)。ありがとうございました :)。awkの文字列と一致する文字列を分割することによって

入力

chr1 955543 955763 chr1:955543-955763 AGRN-6|gc=75 1 25 
chr1 955543 955763 chr1:955543-955763 AGRN-6|gc=75 2 25 
chr1 1167809 1168658 chr1:1167809-1168658 B3GALT6-42|gc=75.8 1 2 
chr1 1167809 1168658 chr1:1167809-1168658 B3GALT6-42|gc=75.8 2 2 
chr1 1167809 1168658 chr1:1167809-1168658 B3GALT6-42|gc=75.8 3 2 
chr1 976035 976270 chr1:976035-976270 AGRN-9|gc=74.5 228 28 
chr1 976035 976270 chr1:976035-976270 AGRN-9|gc=74.5 229 28 
chr1 976035 976270 chr1:976035-976270 AGRN-9|gc=74.5 230 27 

所望の出力$5によってソート$7の平均と$5$4スプリットをマッチング)

chr1:955543-955763 2 AGRN 25 
chr1:976035-976270 3 AGRN 27 
chr1:1167809-1168658 3 B3GALT6 2 

AWK
awk ' 
function file_print() { 
for(k in a) { 
split(k, ks,/|(-[0-9]*[|])/) 
printf("%s %d %s %d\n", ks[1], c[k], ks[2], a[k]/c[k]) > ofn 
delete a[k] 
delete c[k] 
} 
close(ofn) 
} 
NR > 1 && FNR == 1 { 
file_print() 
} 
FNR == 1 { 
ofn = substr(FILENAME, 1, length(FILENAME)) 
} 
{ a[k = $4 " " $5] += $7 
c[k]++ 
} 
END { file_print() 
}' input 

答えて

1

私はあなたがタスクを複雑にしていると思います。

私はあなたの条件を理解していれば、これは(わずかに異なる順序で)の出力を生成します。

awk '{seen[$4]++; sub(/-.*/, "", $5); field[$4]=$5; sum[$4]+=$7} 
     END{for (e in seen) print e, seen[e], field[e], int(sum[e]/seen[e])}' file 

chr1:1167809-1168658 3 B3GALT6 2 
chr1:976035-976270 3 AGRN 27 
chr1:955543-955763 2 AGRN 25 

あなたがそのようによう$5によってグループやソートにsortを通してそれを実行することができます。

awk '{seen[$4]++; sub(/-.*/, "", $5); field[$4]=$5; sum[$4]+=$7} 
     END{for (e in seen) print e, seen[e], field[e], int(sum[e]/seen[e])}' file | sort -k 2 

chr1:955543-955763 2 AGRN 25 
chr1:976035-976270 3 AGRN 27 
chr1:1167809-1168658 3 B3GALT6 2 
+0

を両方とも非常にありがとう...私は間違いなく事をovercomplicatingていた:)。 – Chris

1

awkレスキュー!

$ awk '{split($5,f,"-"); k=$4 OFS f[1]; s[k]+=$NF; c[k]++} 
    END{for(k in s) print k, c[k], int(s[k]/c[k])}' file 

chr1:955543-955763 AGRN 2 25 
chr1:976035-976270 AGRN 3 27 
chr1:1167809-1168658 B3GALT6 3 2 

メモ$ 5プレフィックスもキーの一部であるため、注文には若干違いがあります。また、平均はあなたの例のように切り捨てられます。並べ替える必要がある場合は、... | awk '{t=$2;$2=$3;$3=t}1'にパイプして、2つのフィールドを入れ替えます。