我有 2 个遗传数据集,都有一个染色体位置列。我试图根据每行的染色体位置与文件 2 中的染色体位置进行比较来过滤文件 1。文件 1 行提取的条件是,只有染色体位置比文件 2 大 5000 以上或小 5000 以下的行选择文件 2 的所有行中的任何给定染色体位置。最终,我试图确保从文件 1 中提取的那些遗传变异比文件 2 中的遗传变异具有大于 5000 +/- 的距离。
例如我的数据如下所示:
文件一:
Variant Chromosome Position
Variant1 14000
Variant2 9000
Variant3 37000
Variant4 21000
文件2:
Variant Chromosome Position
Variant1 10000
Variant2 20000
Variant3 30000
预期输出(与文件 2 的每一行相比,位置距离大于 5000 的变体):
Variant Chromosome Position
Variant3 37000
我发现从 2 个文件中提取数据存在问题,但取决于匹配或取消。我还没有找到应用 +/- 条件来解决我的问题的东西,并且我不确定还可以在哪里查看/学习。我是 Linux 新手,所以我一直在尝试构建一个具有以下效果的命令:
awk 'BEGIN{FS=OFS="\t"} FNR==1{print;next} {if($2>=+5000 | $2<=-5000) print $0}' file1 file2 > newfile
但我不确定使其工作的语法 - 任何帮助或指导将不胜感激。
答案1
也尝试一下(考虑范围之间的“漏洞”)
$ awk '
NR == FNR {RGMIN[++IX] = $2 - 5000 # from file2, create min and
RGMAX[IX] = $2 + 5000 # max range boundaries
next
}
FNR == 1 {print # print file1 header; don't process line further
next
}
{PR = 1 # set PRintout logical variable
for (i=2; i<=IX; i++) PR = PR * ($2 < RGMIN[i] || $2 > RGMAX[i])
# reset PR to 0 if $2 inside any of the
# ranges; skip file2's header by starting
# loop at IX 2
}
PR # print if outside ALL ranges
' file2 file1
Variant Chromosome Position
Variant3 37000