如果一列匹配,而另一列的值低于5x10^-8,则UNIX将行复制到新文件
类似的问题很多以前的(包括我的),但我找不到解决办法。这纯粹是一个语法错误,我不知道如何使它工作 我在Unix中有两个文件。在file1中,我有5列和大约6000行。如果第1列完全匹配,并且如果file1第5行的值小于所述行的0.00000005,我将尝试将file2中的行与file1中的行进行匹配 文件1:如果一列匹配,而另一列的值低于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
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