【问题标题】:awk sum column based on matching header pattern基于匹配标题模式的 awk sum 列
【发布时间】:2021-04-22 11:48:50
【问题描述】:

我有一个包含 ~10,000 列和 ~20,000 行的文件,格式如下

Id  A_1 A_2 A_3 B_2 B_5 C_1
T1  0   1   1   6   1   0
T2  1   1   1   0   0   1
T3  2   0   3   1   1   5
T4  1   1   1   2   3   1 

在标题行中,第一列是 id。从第 2 列开始,样品名称采用以下格式 sampleName_batch#。现在,我想根据 sampleName 添加 id 的所有值,并在输出中包含 sampleName 和 sum up 值。我的预期输出是

Id  A   B   C
T1  2   7   0
T2  3   0   1
T3  5   2   5
T4  3   5   1

我遇到了这个答案https://unix.stackexchange.com/questions/569615/combine-columns-in-one-file-by-matching-header,但我不知道如何修改整个标题行。

谢谢

【问题讨论】:

    标签: awk


    【解决方案1】:

    我正在尝试从跨站点编辑 OP 帖子中提到的解决方案,它在解决方案中进行了一些调整,并且所有行都与来自它的行相同。我没有像awk 中的“THE Ed Morton”这样的知识,所以谦虚地接受他的许可(我希望他同意)尝试从跨站点编辑他的出色解决方案,请您尝试关注。

    awk '
    NR==1 {
        for (inFldNr=2; inFldNr<=NF; inFldNr++) {
            sub(/_.*/,"",$inFldNr)
            fldName = $inFldNr
            if ( !(fldName in fldName2outFldNr) ) {
                outFldNr2name[++numOutFlds] = fldName
                fldName2outFldNr[fldName] = numOutFlds
            }
            outFldNr = fldName2outFldNr[fldName]
            out2inFldNrs[outFldNr,++numInFlds[outFldNr]] = inFldNr
        }
    
        printf "%s%s", $1, OFS
        for (outFldNr=1; outFldNr<=numOutFlds; outFldNr++) {
            outFldName = outFldNr2name[outFldNr]
            printf "%s%s", outFldName, (outFldNr<numOutFlds ? OFS : ORS)
        }
        next
    }
    {
        printf "%s%s", $1, OFS
        for (outFldNr=1; outFldNr<=numOutFlds; outFldNr++) {
            sum = 0
            for (inFldIdx=1; inFldIdx<=numInFlds[outFldNr]; inFldIdx++) {
                inFldNr = out2inFldNrs[outFldNr,inFldIdx]
                sum += $inFldNr
            }
            printf "%s%s", sum, (outFldNr<numOutFlds ? OFS : ORS)
        }
    }
    '  Input_file
    

    在现有 Ed 的代码中添加了什么:

    1. 添加sub 函数以替换第一行(标题)中_ 之后的所有内容。
    2. 删除了 \t 作为分隔符,因为 OP 的样本不是制表符分隔的。

    【讨论】:

    • 在增强方面做得很好!
    • @RavinderSingh13 不好意思再次问你。如果我有七列 id 而不是一列,该怎么办?谢谢
    • @Ashi,你好 Ashi,很抱歉我没听明白,如果这是一个新问题,请告诉我,谢谢。
    • @RavinderSingh13 我只是为修改后的输入文件编辑问题。
    • @Ashi,哦,请不要编辑旧问题,因为它会使每个人都感到困惑。请恢复对此问题的更改并针对您的要求打开一个新问题,谢谢。
    猜你喜欢
    • 2013-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多