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
脚本说明
- 指定列提取:通过
-v TARGET_COL=4可自定义提取的列(示例为第4列mean) - 表头处理:自动跳过输入文件的第一行表头,输出表头为
contig+各来源文件名 - 来源标注:用输入文件名(不含后缀)作为列标题,明确数据来源
- 有序输出:通过
PROCINFO["sorted_in"]按contig名称排序,避免输出顺序混乱 - 空值处理:无对应数据的位置自动留空,符合格式要求
最终输出示例
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
相关产品推荐
相关产品推荐

