管道符号前awk中按字段计数

管道符号前awk中按字段计数,awk,Awk,我试图在之前计算文件中$2中的唯一条目: 文件 chr11:101323676-101323847 TRPC6|gc=39.2 143.1 chr11:101324359-101324478 TRPC6|gc=38.7 146.4 chr11:101325731-101325850 TRPC6|gc=32.8 84.5 chr11:101341904-101342127 TRPC6|gc=43.5 197.9 chr12:5153304-5155165 KCN

我试图在
之前计算文件中
$2
中的唯一条目:

文件

chr11:101323676-101323847   TRPC6|gc=39.2   143.1
chr11:101324359-101324478   TRPC6|gc=38.7   146.4
chr11:101325731-101325850   TRPC6|gc=32.8   84.5
chr11:101341904-101342127   TRPC6|gc=43.5   197.9
chr12:5153304-5155165   KCNA5|gc=65.1   633.7
chr12:52306230-52306349 ACVRL1|gc=58.8  152.4
chr12:52306868-52307149 ACVRL1|gc=66.5  309.6
chr12:52307328-52307569 ACVRL1|gc=66.8  305.9
chr12:52307743-52307872 ACVRL1|gc=64.3  267.1
所需输出

三,

尝试:

awk '{sub(/:.*/,"",$2)} !seen[$2]++{unq++} END{print unq}' file.txt

目前,我得到了一个非常不同的数字,我认为这是必要的,因为我需要在
上拆分,但不确定正确的方式。谢谢:)。

你就快到了。只需将
sub()中使用的正则表达式中的
\\124;
替换为

您还可以像这样使用分隔符:

awk -F'[|]| +' '!seen[$2]++{c++}END{print c}' file
我正在使用
|
或一个或多个空格作为分隔符。这样就可以以
$2
的形式访问感兴趣的部分


其余部分遵循与您问题中的示例相同的逻辑:我们使用
$2
作为查找表
seen
中的索引,并检查此索引以前是否出现过。如果不是,我们增加计数器
c
,并在最后打印
c

awk
,以进行救援

$ awk '{split($2,a,"|"); c[a[1]]} 
    END{for(k in c) count++; print count}' file

3
或较短版本

$ awk '{split($2,a,"|"); if(!c[a[1]]++) count++} 
    END{print count}' file
最短的

$ awk 'split($2,a,"|") && !c[a[1]]++{u++} END{print u}' file

添加另一个子项,即
sub/\\\\.*$/,“”,$0)
。祝你好运,嗯。。我还认为您需要调试您的步骤。在适当的位置添加
print#dbg:$2 before=“$2
print”#dbg$2 after=“$2
应该会有帮助。祝你好运。非常感谢大家:)
$ awk 'split($2,a,"|") && !c[a[1]]++{u++} END{print u}' file