我使用下面的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
答案 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