如何用双管道解释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的行呢?我在那里也有NAs
TWAS.P
在一个数字比较上下文中,如您所示,是数字
0
,因此我不知道您所说的打印行TWAS.P<0.05/461
是什么意思,因为该条件始终为真。抱歉,您应该发布一个新问题。这正是您的脚本所做的。同样,为什么不在一些更简单的数据和更简单的条件上尝试它,以便更好地理解语义。
awk 'NR == 1 || $NF < 0.05/461' CHR.17.dat