根据单独文件中指定的范围选择多列行

根据单独文件中指定的范围选择多列行

我有两个文件:

文件1

ST4.03ch10 56000001 56500000
ST4.03ch11 34500001 35000000
ST4.03ch04 54500001 55000000
ST4.03ch12 500001 1000000

文件2

ST4.03ch12 56014301 56019800 0.163 基因 5.5
ST4.03ch12 56022401 56025300 0.419 基因 2.9
ST4.03ch12 671201 803500 1 基因 5.5
ST4.03ch12 671201 8035 00 1 基因 5.3
ST4.03ch12 671201 803500 1 基因 5.0
ST4.03ch12 447401 449500 0.038 基因 8.5
ST4。 03ch12 671201 803500 1 基因 9.5

编辑:在这里添加了我的部分真实数据,因为基于之前的示例数据创建的代码不能很好地处理真实数据。

我想根据以下三个条件选择并打印 file2 中与 file1 中的行之一匹配的行:

1. col1 of file2 = col1 of file1;  
2. col2 of file2 >/= col2 of file1, and  
3. col3 of file2 </= col3 of file1

我想做的是:文件 1 包含 col1 中的标识符(ST4.03chXX)以及 col2 (起点)和 col3 (终点)中相应的协调范围,并且我正在文件 2 中查找条目:
1) colA 中的标识符与文件 1 和 2 中的标识符相匹配
) 的起始和结束坐标(colB 和 colC)落在文件 1 中相应标识符的范围内

预期输出:

ST4.03ch12 671201 803500 1 基因 5.5
ST4.03ch12 671201 803500 1 基因 5.3
ST4.03ch12 671201 803500 1 基因 5.0
ST4.03ch12 671201 803500 1 基因 9.5

实际的文件(尤其是文件 2)非常大,所以我希望使用 完成工作awk,但如果需要的话循环也可以。

答案1

你可以尝试这样的事情:

awk 'NR==FNR{z[$1]?z[$1]=z[$1]"|"$2"|"$3:z[$1]=$2"|"$3;next}
{if ($1 in z){l=split(z[$1], k, "|");
{for (i=1;i<l;i+=2){if ($2>=k[i] && $3<=k[i+1]){print}}}}}' file1 file2

这会读取file1,用 a 连接第二个和第三个字段|并将其保存到一个数组中z(由第一个字段索引),然后读取file2并检查第一个字段是否在z- 如果是,则它会拆分z[1st field]|k[i]为它的每个奇数值i打印该行,如果第2场>=k[i]和第3场<=k[i+1]

相关内容