1

現在、まだ解決できていない AWK の問題に取り組んでいます。位置を含むリスト (列 1 と 2 で宣言) を保持するゲノム データと、いくつかの範囲を保持する 2 つ目のリスト (列 3、4 および 5 で宣言) を含む 1 つの巨大なファイル (30GB) があります。秒ファイルで宣言された範囲内にある最初のファイルのすべての行を抽出したい。位置は特定の染色体 (chr) 内でのみ一意であるため、最初に chr が同一であるかどうかをテストする必要があります (つまり、ファイル 1 の col1 がファイル 2 の col3 と一致する)。

ファイル 1

chromosome position another....hundred.....columns
chr1       816 .....
chr1       991 .....
chr2       816 .....
chr2       880 .....
chr2       18768 .....
...
chr22      9736286 .....

ファイル 2

name    identifier chromosome   start    end
GENE1   ucsc.86    chr1         800      900
GENE2   ucsc.45    chr2         700      1700
GENE3   ucsc.46    chr2         18000    19000

期待される出力

chromosome position another....hundred.....columns
chr1       816 .....
chr2       816 .....
chr2       880 .....
chr2       18768 .....

私がやろうとしていることの要約(半分はコード化されています):

(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
   }
}

file1 を配列に入れ、位置をインデックスとして使用することでこの問題を解決する方法を理解している場合は親切ですが、まだ chr に問題があり、さらに file1 が大きすぎて配列に入れることができません (ただし、128GB の羊)。多次元配列でいくつかのことを試しましたが、それを行う方法も実際にはわかりませんでした。

ご協力ありがとうございました。

更新 2014 年 8 月 5 日 同じクロムの別の範囲を含むファイル 2 に 3 行目を追加しました。2 行目のように。この行は、以下のスクリプトではスキップされます。

4

2 に答える 2

3

データセットの変更により、実際に質問が大幅に変更されました。キーとして使用される要素を導入しましたが、キーは一意である必要があるため、上書きされました。

データ セットについては、複合キーを作成することをお勧めします。何かのようなもの:

awk '
NR==FNR{ range[$3,$4,$5]; next }
FNR==1
{
    for(x in range) {
        split(x, check, SUBSEP); 
        if($1==check[1] && $2>=check[2] && $2<=check[3]) print $0
    }
}    
' file2 file1
chromosome position another....hundred.....columns
chr1       816 .....
chr2       816 .....
chr2       880 .....
chr2       18768
于 2014-05-08T13:37:55.827 に答える