$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
を両方とも非常にありがとう...私は間違いなく事をovercomplicatingていた:)。 – Chris