我有两个文件:
region.txt:第一列是染色体名称,第二列和第三列是开始和结束位置。
1 100 200
1 400 600
2 600 700
coverage.txt:第一列是染色体名称,第二列和第三列是开始和结束位置,最后一列是分数。
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
如果有人可以教我如何摆脱 matlab 脚本中的所有循环,我会很高兴使用 AWK、Perl 或...等进行替代。
谢谢