awk中唯一文本的错误计数

时间:2016-03-07 23:11:28

标签: awk

我使用下面的awk得到错误的计数。 <{1}}之前的$5中的唯一文字应该被计算在内。

输入

-

当前输出

chr1    955543  955763  chr1:955543-955763  AGRN-6|gc=75    1   15
chr1    955543  955763  chr1:955543-955763  AGRN-6|gc=75    2   16
chr1    955543  955763  chr1:955543-955763  AGRN-6|gc=75    3   16
chr1    1267394 1268196 chr1:1267394-1268196    TAS1R3-46|gc=68.2   553 567
chr1    1267394 1268196 chr1:1267394-1268196    TAS1R3-46|gc=68.2   554 569
chr1    9781175 9781316 chr1:9781175-9781316    PIK3CD-276|gc=63.1  46  203
chr1    9781175 9781316 chr1:9781175-9781316    PIK3CD-276|gc=63.1  47  206
chr1    9781175 9781316 chr1:9781175-9781316    PIK3CD-276|gc=63.1  48  206
chr1    9781175 9781316 chr1:9781175-9781316    PIK3CD-276|gc=63.1  49  207

期望输出(AGRN,TAS1R3,PIK3CD)是唯一的并且已计算

1

AWK

3

2 个答案:

答案 0 :(得分:7)

尝试

awk -F '-| +' '!seen[$6]++ {n++} END {print n}' file

' '(空格)被包含为正则表达式的部分 以形成FS(通过{{1 } <}> 丢失其特殊的默认值行为仅将空格单独匹配作为分隔符。 也就是说,识别运行的空格(任何空格和标签的混合)作为单个分隔符的默认行为不再适用。

因此,-F不会作为字段分隔符,因为将相邻空格之间的空字符串识别为空字段

您可以通过打印字段数来验证这一点 - 根据您的预期解析,您期望 9 字段:

[- ]

需要更改$ awk -F '[- ]' '{ print NF }' file 17 # !! 8 extra fields - empty fields $ awk -F '-| +' '{ print NF }' file 9 # OK, thanks to modified regex 以确保运行空格被视为单个分隔符;如果还应匹配制表符,请使用-| +

答案 1 :(得分:2)

在FS中包含“ - ”在某些情况下可能没问题,但一般情况下如果实际的字段分隔符是其他东西(例如空格,就像这里的情况,或者可能是标签),那会好得多根据文件格式的规范设置FS。无论如何,很容易提取感兴趣的子域。在下文中,我将假设FS是空白。

awk '{split($5, a, "-"); if (!(count[a[1]]++)) n++ }
     END {print n}'

如果您需要详细信息:

awk '{split($5, a, "-"); count[a[1]]++}
     END { for(i in count) {print i, count[i]}}'

第二个咒语的输出:

AGRN 3
PIK3CD 4
TAS1R3 2