如何用双管道解释awk命令?
我有这样一个文件:如何用双管道解释awk命令?,awk,Awk,我有这样一个文件: head CHR.17.dat PANEL FILE ID CHR P0 P1 HSQ BEST.GWAS.ID BEST.GWAS.Z EQTL.ID EQTL.R2 EQTL.Z EQTL.GWAS.Z NSNP NWGT MODEL MODELCV.R2 MODELCV.PV TWAS.Z TWAS.P NA ./weight//retina/retina.ENSG00000002834.wgt.RDat LASP1
head CHR.17.dat
PANEL FILE ID CHR P0 P1 HSQ BEST.GWAS.ID BEST.GWAS.Z EQTL.ID EQTL.R2 EQTL.Z EQTL.GWAS.Z NSNP NWGT MODEL MODELCV.R2 MODELCV.PV TWAS.Z TWAS.P
NA ./weight//retina/retina.ENSG00000002834.wgt.RDat LASP1 17 38869859 38921770 0.082133 NA NA NA NA NA NA 0 0 enet 4.53e-02 9.26e-06 NA NA
NA ./weight//retina/retina.ENSG00000002919.wgt.RDat SNX11 17 48103357 48123074 0.014947 NA NA NA NA NA NA 0 0 lasso -1.91e-03 6.32e-01 NA NA
NA ./weight//retina/retina.ENSG00000004139.wgt.RDat SARM1 17 28364356 28404049 0.095283 rs8076604 2.52 rs1128162 -1.96e-0 -3.31 0.67843 94 94 blup 2.19e-02 1.66e-03 0.64027 0.52200
你能解释一下这个命令的作用吗
cat CHR.17.dat | awk 'NR == 1 || $NF < 0.05/461'
cat CHR.17.dat | awk'NR==1 | |$NF<0.05/461'
在许多语言中,在awk|
中表示或。如果当前输入行是第一行(NR==1
)或(|
)当前行上最后一个输入字段($NF
)的值小于给定值($NF<0.05/461
),则该命令将产生输出
所以它会打印标题行和第二个条件为真的任何其他行
这涉及到一个问题:
cat CHR.17.dat | awk'NR==1 | |$NF<0.05/461'
而应该写上:
awk 'NR == 1 || $NF < 0.05/461' CHR.17.dat
awk'NR==1 | |$NF<0.05/461'CHR.17.dat
这是否回答了您的问题@WiktorStribiżew这是一个与|
非常不同的上下文和语义-在这个问题的上下文中,它不是或,与在当前上下文中的方式不同,在该上下文中,它意味着如果最后执行的命令失败,那么执行以下操作…
。要将其理解为shell中的或,您需要考虑shell在执行每个命令时假设它会成功,然后cmd1 | | cmd2
意味着类似cmd1成功,所以不做任何事情或执行cmd2
,但我认为这是一个延伸,更像是其他,但也不是这样。我说”“也不是“因为如果它是一个else
,那么cmd1&&cmd2 | | cmd3
将意味着执行cmd1,如果它成功调用cmd2 else调用cmd3
,但这并不意味着它意味着执行cmd1;如果成功,则调用cmd2;如果cmd1或cmd2失败,则调用cmd3
,因为它适用于最后执行的命令的退出状态,如果cmd1
失败,则cmd2
将不会执行,因此|
将应用于cmd1
的退出状态,但如果cmd1
成功,则cmd2
将执行然后将应用|
的退出状态为cmd2
。无论如何-没有什么比awk中的|
更棒的了!非常感谢,所以如果TWAS.P<0.05/461?否,基本上会打印该行。以TWAS.P结尾的行将被打印,因为它是第一行,因此条件NR==1
为真。当最后一个字段小于0.05/461
时,每隔一行将打印一次。为什么不尝试使用更简单的比较,比如$NF<10
,以及更简单的输入,比如ab5
和cd15
?非常感谢,我知道这有点超出了这个问题的范围,但是如何打印TWAS.P<0.05/461的行呢?我在那里也有NAsTWAS.P
在一个数字比较上下文中,如您所示,是数字0
,因此我不知道您所说的打印行TWAS.P<0.05/461
是什么意思,因为该条件始终为真。抱歉,您应该发布一个新问题。这正是您的脚本所做的。同样,为什么不在一些更简单的数据和更简单的条件上尝试它,以便更好地理解语义。
awk 'NR == 1 || $NF < 0.05/461' CHR.17.dat