awk在匹配字段中打印大多数事件

时间:2017-06-15 12:54:24

标签: awk

在下面的awk中,我在$7上分割:,然后计算每一行或NM_xxxx。如果每行的$1值相同,则打印出匹配$7值最多的$1awk似乎很接近,但我不确定发生了什么。我包括了一个描述以及我认为正在发生的事情。谢谢你:)。

AWK

awk -F'[\t:]' '{count[$7]++} END {for (word in count) print $1, word, count[word]}' file

描述

awk -F'[\t:]'   ---- regex for FS `\t` and split `:`
'{count[$7]++}  ---- count each `line in $7` and read into array count
{for (word in count)   ---- start loop using array count and read each line in array word
print $1, word, count[word]}    ---- print desired fields `$1, [word] (only print count[word] to confirm, it is not needed)

文件

A2M 2   18171   33210   coding  na  NM_000014.5:c.2998A>G   c.2998A>G
A2M 2   18172   33211   coding  na  NM_000014.5:c.2915G>A   c.2915G>A
A2M 2   18173   33212   coding  na  NM_000014.4:c.2125+1_2126-1del  c.2125+1_2126-1del
A2M 2   18174   33213   coding  na  NM_000014.5:c.2111G>A   c.2111G>A
A2M 2   402328  390084  coding  na  NM_000014.5:c.2126-6_2126-2delCCATA
A4GALT  53947   2692    17731   coding  na  NM_017436.5:c.548T>A    c.548T>A
A4GALT  53947   2693    17732   coding  na  NM_017436.5:c.752C>T    c.752C>T
A4GALT  53947   2694    17733   coding  na  NM_017436.6:c.783G>A    c.783G>A
A4GALT  53947   2695    17734   coding  na  NM_017436.6:c.560G>A    c.560G>A
A4GALT  53947   2696    17735   coding  na  NM_017436.6:c.240_242delCTT
A4GALT  53947   2697    17736   coding  na  NM_017436.6:c.1029dupC  c.1029dupC
A4GALT  53947   39437   48036   coding  na  NM_017436.6:c.631C>G    c.631C>G    

当前输出

2
NM_017436.6 5
NM_000014.4 1
NM_000014.5 4
NM_017436.5 2

所需的输出

A2M NM_000014.5
A4GALT NM_017436.6 

2 个答案:

答案 0 :(得分:2)

使用GNU awk实现真正的多维数组:

$ cat tst.awk
BEGIN { FS="[\t:]" }
{
    cnt[$1][$7]++
    max[$1] = (max[$1] > cnt[$1][$7] ? max[$1] : cnt[$1][$7])
}
END {
    for (word in cnt) {
        for (val in cnt[word]) {
            if (cnt[word][val] == max[word]) {
                print word, val
            }
        }
    }
}

$ awk -f tst.awk file
A4GALT NM_017436.6
A2M NM_000014.5

答案 1 :(得分:1)

在问题文件中,我们无法区分标签和空格。 只需在密钥中添加$1即可。

awk -F'[\t:]' '{count[$1 "\t" $7]++} END {for (word in count) print word, count[word]}' file