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

如何用Awk为多chr文件添加序号列并提取指定列合并输出?

解决awk传递shell变量错误的问题

你遇到的问题核心是没有正确将shell循环变量传递到awk环境中,导致awk把$K当成了字符串输出,而非实际的染色体编号N。下面是两种可靠的解决方法:

方法1:用awk的-v选项传递变量(推荐)

这是最清晰不易出错的方式,通过-v参数把shell变量的值注入awk的内部变量:

# 先清空输出文件(如果存在)
> outfile.txt
# 遍历1到22号染色体文件
for K in {1..22}; do
    awk -v chr="$K" '{print chr, $1, $9}' infile_chr${K}.txt >> outfile.txt
done
  • -v chr="$K":将shell变量K的数值赋值给awk内部的chr变量
  • print chr, $1, $9:输出染色体编号、文件第1列、第9列内容

方法2:通过shell字符串解析传递变量

如果想用双引号包裹awk代码,让shell先替换变量值,注意要转义awk的列变量(避免被shell解析):

> outfile.txt
for K in {1..22}; do
    awk "{print $K, \$1, \$9}" infile_chr${K}.txt >> outfile.txt
done
  • "$K"会被shell替换为实际的数字(比如1、2...)
  • \$1和\$9是转义后的awk列变量,确保awk能正确识别它们

额外优化:处理表头

如果输入文件包含表头,不想重复输出,可以跳过第一行:

> outfile.txt
for K in {1..22}; do
    awk -v chr="$K" 'NR>1 {print chr, $1, $9}' infile_chr${K}.txt >> outfile.txt
done

如果需要统一添加输出表头:

# 先写入表头
echo "chr col1 col9" > outfile.txt
# 再遍历文件追加内容
for K in {1..22}; do
    awk -v chr="$K" '{print chr, $1, $9}' infile_chr${K}.txt >> outfile.txt
done

内容的提问来源于stack exchange,提问作者Gio.Mode

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 10:02:48