如果一列匹配,而另一列的值低于5x10^-8,则UNIX将行复制到新文件

如果一列匹配,而另一列的值低于5x10^-8,则UNIX将行复制到新文件,unix,copy,conditional,line,Unix,Copy,Conditional,Line,类似的问题很多以前的(包括我的),但我找不到解决办法。这纯粹是一个语法错误,我不知道如何使它工作 我在Unix中有两个文件。在file1中,我有5列和大约6000行。如果第1列完全匹配,并且如果file1第5行的值小于所述行的0.00000005,我将尝试将file2中的行与file1中的行进行匹配 文件1: SNPs Context Intergenic Risk Allele Frequency p-Value rs9747992 Intergenic 1 0.086

类似的问题很多以前的(包括我的),但我找不到解决办法。这纯粹是一个语法错误,我不知道如何使它工作

我在Unix中有两个文件。在file1中,我有5列和大约6000行。如果第1列完全匹配,并且如果file1第5行的值小于所述行的0.00000005,我将尝试将file2中的行与file1中的行进行匹配

文件1:

SNPs    Context Intergenic  Risk Allele Frequency   p-Value
rs9747992   Intergenic  1   0.086   2.00E-07
rs2059865   Intron  0   0.235   3.00E-07
rs117020818 Intergenic  1   0.046   7.00E-07
rs1074145   Intergenic  1   0.162   4.00E-09
文件2:

snpid hg18chr bp a1 a2 zscore pval CEUmaf
rs3131972   1   742584  A   G   0.289   0.7726  .
rs3131969   1   744045  A   G   0.393   0.6946  .
rs3131967   1   744197  T   C   0.443   0.658   .
rs1048488   1   750775  T   C   -0.289  0.7726  .
我可以做第一部分,但它会不断输出一个比前两部分大的文件。我不确定这是否是一个真实的结果文件或只是充满了重复?我也不能执行“小于”命令。我尝试将其作为第二种模式放入命令中,并将其管道化,如下所示:

awk 'FNR==NR{a[$1]=$0;next}{if ($1 in a) {print $0}}' file1 file2 > output | awk '{if (a[$5] < 0.00000005)}'
awk'FNR==NR{a[$1]=0;next}{if($a中的1){print$0}}}'file1 file2>输出| awk'{if(a[$5]<0.00000005)}'

awk'FNR==NR{a[$1]=$0;next}{if($1 in a&&$5<0.00000005)}{print$0}}}file1 file2>输出
这两次它都给了我相同大小的文件,比file1或file2大很多。如果你想要表格的例子,请说

暂定解决办法:

我正在使用的一个暂定解决方案是只创建一个新文件,其中只包含file1中具有该file11的行
根据我上面的评论,如果您使用file2作为筛选列表,则需要将其加载到
a[]
数组中

我已经制作了一个小样本来说明它是如何工作的,
$28<.000005
的测试应该很容易添加到代码中

使用文件data1

1 2 3 4 5 6 7
2 3 4 5 6 7 8
4 5 8 7 8 9 10
和文件搜索列表

3
然后

输出

2 3 4 5 6 7 8
编辑根据我们在评论中的对话,在没有看到您所需输出的情况下,我的最佳猜测是

我在文件1中添加了一条额外的记录,以便可以进行匹配

rs3131972   Intergenic  1   0.086   2.00E-07


awk '( FNR==NR && (sprintf("%.07f",$5) < .000000005) ) {
        a[$1]=$0
        #dbg print "a["$1"]="a[$1]
        next
    } 
    FNR!=NR{ 
        #dbg print "$1="$1 
        if ($1 in a)print "Matched:" $0
    }' file1 file2

IHTH

基于Shellers援助的答案

awk -F $'\t' 'NR==FNR{if ($5 < 0.00000005){a[$1]=$0}} NR!=FNR{if ($1 in a) print $0}' file1 file2 > output
awk-F$'\t''NR==FNR{if($5<0.00000005){a[$1]=$0}}NR=FNR{if($1 in a)打印$0}'文件1文件2>输出

谢谢

谢勒的回答很好。我的更多是关于你做错了什么。你的第一次尝试

> awk 'FNR==NR{a[$1]=$0;next}{if ($1 in a) {print $0}}
      ' file1 file2 > output | awk '{if (a[$5] < 0.00000005)}'
这(根据省略条件或动作的规则,并经过一些重构)可以简化为

awk 'FNR==NR{a[$1]=$0;next}
    $1 in a' file1 file2 |
awk '$5 < 0.00000005' >output
awk 'FNR==NR{a[$1]=$0;next}
     ($1 in a) && $5 < 0.00000005' file1 file2 > output
这当然可以简化为

awk 'FNR==NR{a[$1]=$0;next}
    $1 in a' file1 file2 |
awk '$5 < 0.00000005' >output
awk 'FNR==NR{a[$1]=$0;next}
     ($1 in a) && $5 < 0.00000005' file1 file2 > output
awk'FNR==NR{a[$1]=$0;next}
(a中的$1)和$5<0.0000000 5'文件1文件2>输出

您的描述让我觉得您想对
file2
中的值进行过滤,但您正在使用
FNR==NR
file1
加载到搜索目标数组中。尝试将第二个cmd的末尾更改为
file2 file1>输出。祝你好运。(解决了格式问题,请先阅读;-))。在第一个cmd中,
…file1 file2>输出| awk…
是一个shell非sequitor。代码
|awk…
不会发生任何事情。您已经用
>输出捕获了所有打印输出。您的第二个解决方案似乎非常接近。我会看几分钟,你也需要学会用尺度思考。您可以使用一个4列数据集提出这个问题,使其正常工作,然后只要将
$1、
(或任何时候)引用更改回$22和$28,就可以认为较小的测试用例正常工作。你能修改你的问题来解决这个问题吗?为这两个文件添加3-4行数据,您将从众多热心的助手那里获得解决方案;-)祝你好运。你的第二个awk脚本有0.0000005(6个零),它应该是0.00000005(7个零)。文件1是包含文件的模式,我想用它来过滤文件2(很抱歉不清楚)。我想从file2中获取与file1中pval<0.00000005的行相匹配的行。我按照你的建议编辑了它。您在这里的方法仍然有用吗?嗯。现在我看到您正在“加倍返回”以从源列表(
file1
)比较
.0000005
值。如果该条件为真,我只会将值放入
a[]
。另外,请从该组输入中添加预期的输出。输出应与文件2完全相同,只是包含较少的行(因为它们应该由文件1过滤)。您在这里的命令会将file2中的所有行打印到输出文件中。有趣的是,我设置了您的文件,当我运行代码时,没有得到任何输出。您是否要求代码可以比较字符串值,如(在文件1的第一行中)
2.00E-07
.00000002
,而无需将其转换为可比较的格式?嗯。。。我在file2.$1中没有看到file1.$1中的任何值。请参阅我的更新,以比较
2.00E-07
.00000002
类型值(使用sprintf)。我现在发现,我没有注意到条件将应用于第一个文件,但既然您已经涵盖了这一点,我就不谈了。感谢您的反馈。慢慢掌握UNIX。
awk 'FNR==NR{a[$1]=$0;next}{if ($1 in a) {print $0}}' file1 file2 |
awk '$5 < 0.00000005' >output
awk 'FNR==NR{a[$1]=$0;next}
    $1 in a' file1 file2 |
awk '$5 < 0.00000005' >output
> awk 'FNR==NR{a[$1]=$0;next}
    {if ($1 in a && $5 < 0.00000005)} {print $0}}' file1 file2 > output
awk 'FNR==NR{a[$1]=$0;next}
    {if ($1 in a && $5 < 0.00000005) print $0}' file1 file2 > output
awk 'FNR==NR{a[$1]=$0;next}
     ($1 in a) && $5 < 0.00000005' file1 file2 > output