求助:编写Shell脚本合并重叠行并拼接对应列数据
刚好做过类似的需求,给你写个实用的Shell脚本,用awk就能高效搞定批量合并的问题!针对你需要合并同一染色体的重叠/连续区间、并将后续列用|拼接的需求,这个脚本可以一次性处理你的20个文件。
完整脚本代码
#!/bin/bash # 批量处理传入的所有文件 for file in "$@"; do # 用awk处理单个文件的核心逻辑 awk ' BEGIN { FS=" "; # 设置输入字段分隔符为空格 OFS=" "; # 设置输出字段分隔符为空格 } # 处理每一行数据 { current_chr = $1 current_start = $2 current_end = $3 # 提取第4到第6列的内容,存到临时变量 field4 = $4 field5 = $5 field6 = $6 # 如果是新的染色体,或者是当前染色体的第一行 if (!prev_chr || prev_chr != current_chr) { # 如果之前有未输出的合并数据,先输出 if (prev_chr) { print prev_chr, merged_start, merged_end, joined_field4, joined_field5, joined_field6 } # 初始化当前染色体的合并参数 prev_chr = current_chr merged_start = current_start merged_end = current_end joined_field4 = field4 joined_field5 = field5 joined_field6 = field6 } else { # 合并区间:更新end为最大的那个(覆盖重叠/连续的情况) if (current_end > merged_end) { merged_end = current_end } # 拼接后续字段 joined_field4 = joined_field4 "|" field4 joined_field5 = joined_field5 "|" field5 joined_field6 = joined_field6 "|" field6 } } # 处理最后一组未输出的数据 END { if (prev_chr) { print prev_chr, merged_start, merged_end, joined_field4, joined_field5, joined_field6 } } ' "$file" > "${file}_merged.txt" echo "✅ 处理完成:$file -> ${file}_merged.txt" done
使用步骤
- 把上面的代码保存成
merge_interval_data.sh文件。 - 给脚本添加执行权限:
chmod +x merge_interval_data.sh - 运行脚本,传入你的20个文件(比如所有
.bed或.txt后缀的文件):./merge_interval_data.sh your_file1.txt your_file2.txt ... your_file20.txt # 或者用通配符批量匹配:./merge_interval_data.sh *.txt
关键细节说明
- 区间合并逻辑:脚本会自动识别同一染色体的行,把重叠/连续的区间合并成从第一个起始到最后一个结束的大区间。
- 字段拼接:第4、5、6列的内容会按顺序用
|连接起来,完全符合你给出的示例格式。 - 文件输出:每个源文件会生成一个
原文件名_merged.txt的结果文件,不会覆盖你的原始数据,安全又方便。 - 排序要求:请确保你的输入文件是按染色体名称、区间起始位置升序排序的,如果没有排序,先对每个文件执行排序命令:
再用脚本处理排序后的文件,否则合并结果会出错。sort -k1,1 -k2,2n input.txt > sorted_input.txt
内容的提问来源于stack exchange,提问作者Karthik Nair
相关产品推荐
相关产品推荐

