我有两个文件:
文件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]