我有两个文件,每个文件有3列和n行(每个文件中的行数不同)。
每个看起来像这样:
file1
chr1 12 32
chr1 14 30
chr3 10002 89000
chrx 5678900 987654
和此:
file2
chr1 8 15
chr1 10 14
chr1 32 34
每个文件中的第二和第三列表示起始值和结束值,而第一列是名称。
因此,如果第一列(文件1)中的值与文件2的第一列中的值匹配,则脚本应计算它们是否存在重叠(第2列和第3列中值范围的任何重叠程度)在file1中,值范围在文件2的第2列和第3列中,以及文件2中文件1中第二列和第三列中值的范围。
需要这样的输出:
regions from file1 present in file 2
chr1 12 32 present
chr1 14 30 present
chr3 10002 89000 absent
chrx 5678900 987654 absent
对awk操作或python脚本的任何建议......请帮助。
答案 0 :(得分:3)
阅读file2
以创建映射:name - >间隔即,结果是:ranges = {'chr1': [[8, 15], [10, 14], [32, 34]]}
。如果每个名称有多个间隔,那么作为优化,您可以合并它们:ranges = {'chr1': [[8, 15], [32, 34]]}
。
定义overlap(r1, r2)
函数,返回两个区间r1
和r2
是否重叠。指定边缘是否包含在重叠中。
对于file1
中的每一行,找出是否存在重叠并打印适当的输出。