如何根据另一个文件的条件从一个文件中选择行?

如何根据另一个文件的条件从一个文件中选择行?

我有 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

相关内容