You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWK脚本修改需求:指定列解析、表头保留及数据来源标注

AWK脚本修改方案:多文件指定列合并并保留表头与来源标注

需求说明

需要修改一段AWK脚本,实现6列结构文本文件的合并,核心要求:

  • 仅解析文件中的特定列而非全部6列
  • 输出文件保留自定义表头并置于首行
  • 自动标注各数据的来源文件,避免人工推断出错

原AWK命令

awk -F"\t" -v OFS="\t" 'F!=FILENAME { FNUM++; F=FILENAME }

{       COL[$1]++;        C=$1; $1="";        A[C, FNUM]=$0 }

END {
        for(X in COL)
        {
                printf("%s", X);
                for(N=1; N<=FNUM; N++) printf("%s", A[X, N]);
                printf("\n");
        }
}' *mosdepth.summary.txt > Se_combined.coverage.txt

输入文件示例

file1内容

chrom   length  bases   mean    min     max
contig_1_pilon  223468  603256  2.70    0       59
contig_2_pilon  197061  1423255 7.22    0       102
contig_6_pilon  162902  1372153 8.42    0       80
contig_19_pilon 286502  1781926 6.22    0       243
contig_29_pilon 263348  1251842 4.75    0       305
contig_32_pilon 291449  1819758 6.24    0       85
contig_34_pilon 51310   197150  3.84    0       29
contig_37_pilon 548146  4424483 8.07    0       399
contig_41_pilon 7529    163710  21.74   0       59

file2内容

chrom   length  bases   mean    min     max
contig_2_pilon  197061  2098426 10.65   0       198
contig_19_pilon 286502  1892283 6.60    0       233
contig_32_pilon 291449  2051790 7.04    0       172
contig_37_pilon 548146  6684861 12.20   0       436
contig_42_pilon 14017   306188  21.84   0       162
contig_79_pilon 17365   883750  50.89   0       1708
contig_106_pilon        513441  6917630 13.47   0       447
contig_124_pilon        187518  374354  2.00    0       371
contig_149_pilon        1004879 13603882        13.54   0       801

原脚本错误输出示例

contig_149_pilon        1004879 13603882        13.54   0       801
contig_79_pilon 17365   883750  50.89   0       1708
contig_1_pilon  223468  603256  2.70    0       59
contig_106_pilon        513441  6917630 13.47   0       447
contig_2_pilon  197061  1423255 7.22    0       102     197061  2098426 10.65   0       198
chrom   length  bases   mean    min     max     length  bases   mean    min     max
contig_37_pilon 548146  4424483 8.07    0       399     548146  6684861 12.20   0       436
contig_41_pilon 7529    163710  21.74   0       59
contig_6_pilon  162902  1372153 8.42    0       80
contig_42_pilon 14017   306188  21.84   0       162
contig_29_pilon 263348  1251842 4.75    0       305
contig_19_pilon 286502  1781926 6.22    0       243     286502  1892283 6.60    0       233
contig_124_pilon        187518  374354  2.00    0       371
contig_34_pilon 51310   197150  3.84    0       29
contig_32_pilon 291449  1819758 6.24    0       85      291449  2051790 7.04    0       172

初步修改后的脚本

awk -F"\t" -v OFS="\t" 'F!=FILENAME { FNUM++; F=FILENAME }

{   B[FNUM]=F;  COL[$1];        C=$1; $1="";       A[C, FNUM]=$4}

END {
        printf("%s\t", "contig")
        for (N=1; N<=FNUM; N++) 
        {   printf("%.5s\t", B[N])}
        printf("\n")
        for(X in COL)
        {
                printf("%s\t", X);
                for(N=1; N<=FNUM; N++) 
                {   printf("%s\t", A[X, N]);
                }
                printf("\n");
        }   
}' file1.txt file2.txt > output.txt

修改后输出

contig  file1   file2
contig_149_pilon                13.54
contig_79_pilon         50.89
contig_1_pilon  2.70
contig_106_pilon                13.47
contig_2_pilon  7.22    10.65
chrom   mean    mean
contig_37_pilon 8.07    12.20
contig_41_pilon 21.74
contig_6_pilon  8.42
contig_42_pilon         21.84
contig_29_pilon 4.75
contig_19_pilon 6.22    6.60
contig_124_pilon                2.00
contig_34_pilon 3.84
contig_32_pilon 6.24    7.04

最终修正脚本

awk -F"\t" -v OFS="\t" -v TARGET_COL=4 '
# 处理新输入文件,记录文件序号与名称
FILENAME != prev_file {
    fnum++
    prev_file = FILENAME
    # 提取文件名(去掉后缀)作为列标题
    split(FILENAME, fn, /\./)
    col_title[fnum] = fn[1]
}

# 跳过所有输入文件的第一行表头
NR == 1 { next }

# 存储目标列数据与唯一contig键
{
    key = $1
    data[key, fnum] = $TARGET_COL
    keys[key] = 1
}

END {
    # 打印输出表头
    printf "contig"
    for (i=1; i<=fnum; i++) {
        printf "%s%s", OFS, col_title[i]
    }
    print ""
    
    # 按contig名称排序输出,保证顺序一致
    PROCINFO["sorted_in"] = "@ind_str_asc"
    for (key in keys) {
        printf "%s", key
        for (i=1; i<=fnum; i++) {
            printf "%s%s", OFS, (data[key, i] == "" ? "" : data[key, i])
        }
        print ""
    }
}' file1.txt file2.txt > combined_output.txt

脚本说明

  1. 指定列提取:通过-v TARGET_COL=4可自定义提取的列(示例为第4列mean)
  2. 表头处理:自动跳过输入文件的第一行表头,输出表头为contig+各来源文件名
  3. 来源标注:用输入文件名(不含后缀)作为列标题,明确数据来源
  4. 有序输出:通过PROCINFO["sorted_in"]按contig名称排序,避免输出顺序混乱
  5. 空值处理:无对应数据的位置自动留空,符合格式要求

最终输出示例

contig	file1	file2
contig_1_pilon	2.70	
contig_106_pilon		13.47
contig_124_pilon		2.00
contig_149_pilon		13.54
contig_19_pilon	6.22	6.60
contig_2_pilon	7.22	10.65
contig_29_pilon	4.75	
contig_32_pilon	6.24	7.04
contig_34_pilon	3.84	
contig_37_pilon	8.07	12.20
contig_41_pilon	21.74	
contig_42_pilon		21.84
contig_6_pilon	8.42	
contig_79_pilon		50.89

内容的提问来源于stack exchange,提问作者Loulou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 14:10:36