awk中唯一文本的计数不正确
我使用下面的awk中唯一文本的计数不正确,awk,Awk,我使用下面的awk得到了错误的计数。应计算-之前$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 12673
awk
得到了错误的计数。应计算-
之前$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
1
电流输出
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
1
所需输出(AGRN、TAS1R3、PIK3CD)是唯一的且已计数
3
awk
awk -F '[- ]' '!seen[$6]++ {n++} END {print n}' file
试一试
您的问题是当'
(一个空格)作为正则表达式的一部分被包含以形成FS
(通过-F
)时,它将丢失其特殊的默认值行为,并且仅将空格作为分隔符单独匹配。
也就是说,将空白(空格和制表符的任意组合)识别为单个分隔符的默认行为不再适用
因此,[-]
不能用作字段分隔符,因为它将相邻空格之间的空字符串识别为空字段
您可以通过打印字段计数来验证这一点-根据您想要的解析,您需要9个字段:
$ awk -F '[- ]' '{ print NF }' file
17 # !! 8 extra fields - empty fields
$ awk -F '-| +' '{ print NF }' file
9 # OK, thanks to modified regex
需要交替-|+
以确保将空格的运行视为单个分隔符;如果制表符也应该匹配,那么在某些情况下,在FS中使用'-|[:blank:][]+'
在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
我得到了
3
。您使用的是哪个版本的awk
?@hek2mgl:3
是巧合(描述的症状与样本数据不匹配);正在计算另一个字段,因为字段分隔符regex不能按预期工作。