如何对BLAST HitTable跨行列比较 按登录号分组判断序列区间重叠
可用awk单行解决方案
直接执行以下命令即可得到符合你需求的两个输出文件:
awk 'NR==1 {print > "nonover.txt"; print > "overlap.txt"; next} NR>1 && prev_id == $1 { if (prev_end < $3) { print prev_line >> "nonover.txt" } else { print prev_line >> "overlap.txt" print $0 >> "overlap.txt" } } { prev_id = $1 prev_end = $4 prev_line = $0 } END { print prev_line >> "nonover.txt" }' mydata.txt
逻辑说明
- 表头行默认同时写入两个输出文件
- 从第二行开始,仅对比同登录号的相邻行:
- 上一行
seqend小于当前行seqstart(无重叠):将上一行写入nonover.txt - 上一行
seqend大于等于当前行seqstart(有重叠):将相邻两行都写入overlap.txt
- 上一行
- 最后一行默认追加到
nonover.txt,适配你后续自行去重的处理需求
适配空行分隔的优化版本
如果需要在不同登录号的重叠区间之间加空行,匹配你给出的示例输出格式,使用以下命令即可:
awk 'NR==1 {print > "nonover.txt"; print > "overlap.txt"; next} NR>1 && prev_id == $1 { if (prev_end < $3) { print prev_line >> "nonover.txt" } else { if (overlap_flag[prev_id] != 1) { print "" >> "overlap.txt" overlap_flag[prev_id] = 1 } print prev_line >> "overlap.txt" print $0 >> "overlap.txt" } } { prev_id = $1 prev_end = $4 prev_line = $0 } END { print prev_line >> "nonover.txt" }' mydata.txt
内容的提问来源于stack exchange,提问作者Fitzy
相关产品推荐
相关产品推荐

