如何使用bash awk按染色体行头拆分TXT文件为对应独立文件
方案1:单次awk遍历直接拆分(推荐,效率最高)
该方案仅需读取一次原文件即可完成所有染色体拆分,无需循环,天然避免匹配错误、多余行残留问题:
awk '/^chr[0-9]+$/{ close(outfile) outfile = $0".txt" next } {print > outfile}' gwe.txt
逻辑说明:
- 用
^和$限定整行匹配染色体头,完全避免chr1匹配到chr10、chr11这类问题 - 识别到染色体头行时,关闭上一个输出文件,更新当前输出文件名,直接跳过该行不输出
- 其余数值行直接写入对应染色体文件,自动过滤所有chr开头的行头
方案2:修复你的bash循环写法
你原有写法存在3个错误:
- bash变量在单引号包裹的awk代码中无法解析,需要通过
-v参数传入awk - bash中不能直接用
${num+1}做算术运算,需写成$((num+1))格式 - 正则无边界限定、范围匹配默认包含结束行,会导致多余内容写入
修复后的循环代码如下:
for num in {1..21}; do next_num=$((num+1)) awk -v n="$num" -v nn="$next_num" '$0=="chr"n{f=1;next} $0=="chr"nn{f=0} f' gwe.txt > chr${num}.txt done # 单独处理最后一条染色体chr22 awk '$0=="chr22"{f=1;next} f' gwe.txt > chr22.txt
逻辑说明:
- 匹配到当前染色体头时将标记位f设为1,跳过当前行
- 匹配到下一条染色体头时将标记位f设为0
- 仅当f为1时输出内容,完美过滤两个染色体头,无多余内容残留
内容的提问来源于stack exchange,提问作者user
相关产品推荐
相关产品推荐

