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不能按预期工作。