我试图使用awk
获取每个匹配字符串的总长度以及文件中每个匹配的计数。 $5
中的匹配字符串是计数,每个$3 - $2
的总和是总长度。希望下面的awk
是一个好的开始。谢谢你:)。
输入
chr1 1266716 1266926 chr1:1266716-1266926 TAS1R3
chr1 1267008 1267328 chr1:1267008-1267328 TAS1R3
chr1 1267394 1268196 chr1:1267394-1268196 TAS1R3
chr1 1268291 1268514 chr1:1268291-1268514 TAS1R3
chr1 1956371 1956503 chr1:1956371-1956503 GABRD
chr1 1956747 1956866 chr1:1956747-1956866 GABRD
chr1 1956947 1957187 chr1:1956947-1957187 GABRD
chr1 1220077 1220196 chr1:1220077-1220196 SCNN1D
所需的输出
TAS1R3 4 1555
GABRD 3 491
SCNN1D 1 119
AWK
awk '{count[$5]++}
END {
for (word in count)
print $1,$2,$3,$4,word, count[word]
}' input > count |
awk 'print $1,$2,$3,$4,word, count[word]
}
{ $6 = $3 - $2 }
1' count.txt > length
修改
SCNN1D 1 119
GABRD 3 240
TAS1R3 4 223
答案 0 :(得分:1)
使用 awk ,可以在一个脚本中执行整个操作, 通过保持累计长度的运行计数,和每个单词的实例数。
试试这个(尚未经过测试):
awk '{
offset1=$2; offset2=$3; word=$5
TotalLength[word]=offset2 - offset1 # or just $3-$2
count[word]++}
END {
for (word in count)
print word, count[word], TotalLength[word]
}' input
原始脚本有三个错误。
awk
块具有不明确的输入规范:从管道和读取文件参数(count.txt
)。在这种情况下, awk 无法决定从哪里读取。END
部分中,编号字段仅指向最后行/记录读取的字段。这不是你想要的。{
。答案 1 :(得分:1)
你可以这样做:
awk '{c1[$5]++; c2[$5]+=($3-$2)}
END{for (e in c1) print e, c1[e], c2[e]}' input
请注意,记录的顺序可能与原始文件中的顺序不同。
答案 2 :(得分:1)
$ cat tst.awk
$5 != prev { if (NR>1) print prev, cnt, sum; prev=$5; cnt=sum=0 }
{ cnt++; sum+=($3-$2) }
END { print prev, cnt, sum }
$ awk -f tst.awk file
TAS1R3 4 1555
GABRD 3 491
SCNN1D 1 119