awk使用来自文件的匹配字符串计数和总计

时间:2016-03-12 15:56:44

标签: regex awk

我试图使用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 

3 个答案:

答案 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

原始脚本有三个错误。

  1. 第二个awk块具有不明确的输入规范:从管道读取文件参数(count.txt)。在这种情况下, awk 无法决定从哪里读取。
  2. END部分中,编号字段仅指向最后行/记录读取的字段。这不是你想要的。
  3. 最后,第二个awk脚本缺少print语句的左括号{

答案 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