AWK:如果文件1中的列落在其他文件中的两列中声明的范围内,则提取行

Elm*_*mer 0 awk bioinformatics multidimensional-array genome

目前我正在努力应对我尚未能解决的AWK问题.我有一个巨大的文件(30GB),基因组数据包含一个包含位置的列表(在第1列和第2列中声明)和第二个包含多个范围的列表(在第3列,第4列和第5列中声明).我想提取第一个文件中位置落在秒文件中声明的范围内的所有行.由于位置仅在某个染色体(chr)内是唯一的,因此如果chr是相同的(即文件1中的col1与file2中的col3匹配),则必须进行测试.

档案1

chromosome position another....hundred.....columns
chr1       816 .....
chr1       991 .....
chr2       816 .....
chr2       880 .....
chr2       18768 .....
...
chr22      9736286 .....
Run Code Online (Sandbox Code Playgroud)

档案2

name    identifier chromosome   start    end
GENE1   ucsc.86    chr1         800      900
GENE2   ucsc.45    chr2         700      1700
GENE3   ucsc.46    chr2         18000    19000
Run Code Online (Sandbox Code Playgroud)

预期产出

chromosome position another....hundred.....columns
chr1       816 .....
chr2       816 .....
chr2       880 .....
chr2       18768 .....
Run Code Online (Sandbox Code Playgroud)

我想打算做的总结(半编码):

(if $1(in file 1) matches $3(in file 2){            ##test if in the correct chr
   if ($2(in file 1) >= $4 && =< $5 (in file 2){    ##test if pos is in the range
         print $0 (in file 1)                       ##if so print the row from file1
   }
}
Run Code Online (Sandbox Code Playgroud)

我很理解如何通过将file1放在一个数组中并使用position作为索引来理解如何解决这个问题但是我仍然遇到chr的问题,而且file1是一个很大的方法来放入一个数组(虽然我有128GB的内存).我已经尝试了一些多维数组的东西,但无法弄清楚如何做到这一点.

非常感谢您的帮助.

更新8/5/14在文件2中添加了第三行,其中包含相同chrom中的另一个范围.就像在第二行.在下面的脚本中跳过此行.

Ed *_*ton 5

它是这样的,没有经过测试:

awk '
NR==FNR{ start[$3] = $4; end[$3] = $5; next }
(FNR==1) || ( ($1 in start) && ($2 >= start[$1]) && ($2 <= end[$1]) )
' file2 file1
Run Code Online (Sandbox Code Playgroud)

  • @Elmer这适用于我使用您的输入.你发现第一次击中后它意味着什么?您能否更新您的问题以发布失败的数据? (2认同)