Awk 长到宽格式(多列计数字符串)

Awk 长到宽格式(多列计数字符串),awk,data-conversion,Awk,Data Conversion,从长格式转换为宽格式时遇到问题: 我的数据: 79264 Bacteria Firmicutes 79264 Bacteria Firmicutes 79264 Bacteria Firmicutes 2947 Bacteria Nitrospirae 2947 Bacteria Nitrospirae 2947 Bacteria Nitrospirae 2947 Bacteria Nitrospirae 2947

从长格式转换为宽格式时遇到问题:

我的数据:

79264   Bacteria    Firmicutes
79264   Bacteria    Firmicutes
79264   Bacteria    Firmicutes
2947    Bacteria    Nitrospirae
2947    Bacteria    Nitrospirae
2947    Bacteria    Nitrospirae
2947    Bacteria    Nitrospirae
2947    Bacteria    Nitrospirae
2947    Bacteria    Nitrospirae
2947    Bacteria    Proteobacteria
我想要的是:

79264   3_Bacteria  3_Firmicutes
2947    7_Bacteria  6_Nitrospirae,1_Proteobacteria
我在这方面的最佳尝试是使用下面这样的方法,如果我只想对第2列和第3列中的数值进行平均,这将是可行的:

awk '{sum[$1]+=$2; sum2[$1]+=$3; count[$1]++} END{for (x in sum) print x, sum[x]/count[x], sum2[x]/count[x]}'
但事实证明,在列中计算字符串和划分不同的字符串对我来说太难了。非常感谢您的反馈。

gawk

{
    txid[$1]++; 
    for(col=2; col<=NF; col++)
        a[$1][$col]++
}
END{

    for(t in txid){
        row = t " ";
        for(x in a[t]){
            row = row a[t][x] "_" x ", "
        }
        print substr(row,1,length(row)-2)
    }
}
{
txid[$1]++;

对于(col=2;col假设第二个字段字符串
Bacteria
已修复,请尝试:

awk '{
    a[$1]++                                             # count "2947", e.g.
    b[$1,$3]++                                          # count "2947,Nitrospirae", e.g.
}
END {
    for (i in b) {
        split(i, c, SUBSEP)                             # split into "2947" and "Nitrospirae", e.g.
        s[c[1]] = s[c[1]] comma[c[1]] b[i] "_" c[2]     # generate a string after "Bacteria"
        comma[c[1]] = ","                               # appear after 2nd use
    }
    for (i in a) {
        printf("%d %d_%s %s\n", i, a[i], "Bacteria", s[i])
    }
}' data.txt
输出:

79264 3_Bacteria 3_Firmicutes
2947 7_Bacteria 1_Proteobacteria,6_Nitrospirae

第二列
Bacteria
是否已修复?如果可能出现除
Bacteria
以外的其他字符串,请将其作为示例包含在内。请您解释一下要将这些行汇总在一起的条件是什么?是否只是第一列中的值相等?这些值是否可以交错?例如乐:5,8,5(再次)。