【发布时间】:2021-08-09 22:27:55
【问题描述】:
我有两个文件。如果“染色体”列在两个文件之间匹配,并且 File1 的位置在 File2 的 Start_position 和 End_position 之间,我想关联两个 cell_frac 值。如果 File2 中不存在 Gene(染色体 + 位置),我希望两个 cell_frac 值都等于 0。
文件 1:
Hugo_Symbol Chromosome Position
Gene1 1 111111
Gene2 1 222222
Gene3 2 333333
Gene4 2 333337
文件2:
Chromosome Start_Position End_Position cell_frac_A1 cell_frac_A2
1 222220 222230 0.12 0.01
2 333330 333340 0.03 0.25
3 444440 444450 0.01 0.01
期望的输出:
Hugo_Symbol Chromosome Position cell_frac_A1 cell_frac_A2
Gene1 1 111111 0 0
Gene2 1 222222 0.12 0.01
Gene3 2 333333 0.03 0.25
Gene4 2 333337 0.03 0.25
编辑:这是我现在使用的代码的开头(输出不正确):
awk '
NR==FNR{ range[$1,$2,$3,$4,$5]; next }
FNR==1
{
for(x in range) {
split(x, check, SUBSEP);
if($2==check[1] && $3>=check[2] && $3<=check[3]) { print $1"\t"$2"\t"$3"\t"check[4]"\t"check[5]}
}
}
' File2 File1
但是,当基因不存在时,我没有设法将 0(与“else”)关联起来。我得到错误的行数。你能给我更多的提示吗? 非常感谢。
【问题讨论】:
-
输入文件有多大(MBytes,行数)并且都已按 Chromosome 排序?
-
您应该以代码的形式展示您所拥有的东西——如果您没有随身携带,请前往您拥有它的地方。
-
文件有多大?正如@markp-fuso 暗示的那样,为每个文件 1 位置搜索所有文件 2 范围的蛮力方法有点微不足道。如果文件很大,那可能需要很长时间。更复杂的方法会更快,但是您还没有说足够的内容来知道这是否有必要。文件2范围是否重叠的另一件事。您在示例中暗示了这一点,但它总是正确的吗?
-
有效方法的问题是没有来自
File1的唯一字段组合可以作为File2中任何字段的键,染色体值不是唯一的,因此不能用作索引(单独或与SUBSEP和任何其他字段一起使用)。因此,除非您有更多未显示的列,否则您将陷入效率极低的蛮力方法(即使您将File1读入任何数组并且split()将每次检查的值与File2相比较。 -
文件 1 大约 5MB(~900 行),文件 2 大约 KB(~50 行)。文件 1 大约有 500 列,文件 2 大约有 20 列。文件 1 不完全按染色体排序:我有两个按突变类型的连续系列(1->22,然后又是 1->22)。我没有可用的代码,我会尽快用它编辑我的帖子。文件 2 中的范围不重叠,我的示例暗示多个基因可以具有在同一范围内的位置。确实,由于栏目太多,我只展示了感兴趣的栏目。