私は2つのファイルを持っています:
region.txt:最初の列は染色体名、2番目と3番目は開始位置と終了位置です。
1 100 200
1 400 600
2 600 700
Coverage.txt:最初の列は染色体名、2番目と3番目は開始位置と終了位置、最後の列はスコアです。
1 100 101 5
1 101 102 7
1 103 105 8
2 600 601 10
2 601 602 15
このファイルは非常に巨大で、約15GB、約3億行です。
基本的に、regions.txtの各リージョンにあるcoverage.txtのすべてのスコアの平均を取得したいと思います。
つまり、regions.txtの最初の行から開始します。同じ染色体を持つcoverage.txtに行がある場合、start-coverageは> = start-regionであり、end-coverageは<=end-regionです。次に、そのスコアを新しい配列に保存します。すべてのcoverages.txtでの検索が終了したら、領域の染色体、開始、終了、および検出されたすべてのスコアの平均を出力します。
期待される出力:
1 100 200 14.6 which is (5+7+8)/3
1 400 600 0 no match at coverages.txt
2 600 700 12.5 which is (10+15)/2
次のMATLABスクリプトを作成しましたが、coverage.txtを何度もループする必要があるため、非常に時間がかかります。高速なawkのようなスクリプトを作成する方法がわかりません。
私のMATLABスクリプト
fc = fopen('coverage.txt', 'r');
ft = fopen('regions.txt', 'r');
fw = fopen('out.txt', 'w');
while feof(ft) == 0
linet = fgetl(ft);
scant = textscan(linet, '%d%d%d');
tchr = scant{1};
tx = scant{2};
ty = scant{3};
coverages = [];
frewind(fc);
while feof(fc) == 0
linec = fgetl(fc);
scanc = textscan(linec, '%d%d%d%d');
cchr = scanc{1};
cx = scanc{2};
cy = scanc{3};
cov = scanc{4};
if (cchr == tchr) && (cx >= tx) && (cy <= ty)
coverages = cat(2, coverages, cov);
end
end
covmed = median(coverages);
fprintf(fw, '%d\t%d\t%d\t%d\n', tchr, tx, ty, covmed);
end
AWK、Perl、または、...などを使用して代替案を作成するための提案があれば、matlabスクリプトのすべてのループを取り除く方法を誰かが教えてくれれば嬉しいです。
ありがとう