R语言 如何在循环($1==col2[$1])&&($2>=col2[$2])&&($3〈=col2[$3])中使用此条件来比较两个文件前三列

osh3o9ms  于 2022-12-06  发布在  其他
关注(0)|答案(1)|浏览(137)

我有两组基因组坐标。问题是文件1的范围很小,当我与文件2比较时,它可以有多个重叠。所以我想挑选尽可能接近。问题是file1的第一行(假设你有很多行)可以遍历file2的第一行和第二行。($1==第二列[$1])&&($2〉=第二列[$2])&&($3〈=第二列[$3])这样,我就只能取第二个文件第二行。
文件_2
我有文件1
所需输出为
我试过用这个

awk 'NR==FNR { id[$1]=$1; id1[$2]=$2; id2[$3]=$3; next } ($1 == id && $2 >= id1 && $3 <= id2) { print $0"\t"id[$1]"\t"id1[$2]"\t"id2[$3]}' file1.txt file2.txt

但是我没有得到输出我不知道我做错了什么

yxyvkwin

yxyvkwin1#

这里有很多遗漏的信息/混淆,例如每个文件的大小(以行为单位)可能很重要,而且您显式要求的内容不太可能是您实际需要的,因为它不包含任何对file 1的引用,指示为什么保留file 2的结果。
但猜测一些可能接近你所追求的东西。

#! /usr/bin/awk -f 

NR==FNR && !/^$/{                    # collect all file1 (no ens_id)
    n = NR;
    ch[n] = $1;
    lo[n] = $2;
    hi[n] = $3;
    # sense[n] = $4;                # could check direction as well

} 

NR!=FNR && !/^$/ {                  # each item file2
    i=last_hit;
    while(i++ < n){                 # each item in file1
                                    #  *** assume lo strictly before hi
                    

        if(($1 != ch[i]) || ($2 > hi[i]) || ($3<lo[i]) ){   # no chance
                last_hit = i-1;                             # retry with next                       
                next
        }
        else {                                              # plausible 
            if( ($2<=lo[i]) && ($3>=hi[i]) ){               # contained?
                print;                                      # hit
                last_hit = i-1;                             # in case dup hits
            }
        }  
    }
}

有很多地方会出错,但基本上你想知道;
如果您拥有的间隔(file 1)包含在file 2的命名间隔中,可能是因为您想知道file 1中间隔的引用名称。
重要的部分是当找到命中时选择打印的内容较少,
你能修好
以及如何在考虑第二个文件中的每一行时重复地在第一个文件中移动。
last_hit是一种(过早)优化,它取决于文件中排序的间隔,当您处理file 2时,它应该允许更少的file 1被重新访问。

相关问题