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

求助:编写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
使用步骤
  1. 把上面的代码保存成merge_interval_data.sh文件。
  2. 给脚本添加执行权限:
    chmod +x merge_interval_data.sh
    
  3. 运行脚本,传入你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:09:53