select 来自具有阈值的 awk 文件的列,但打印用户定义的列?

select columns from a file with awk having a threshold but print the user defined column?

我想select下面文件中的前 4 列,其阈值小于第 6 列

chr start   end copy number status  WilcoxonRankSumTestPvalue   KolmogorovSmirnovPvalue
1   761750  7202499 3   gain    5.13822497072701e-298   0
1   7289250 7289999 7   gain    0.014309298726355   0.0366367750948455
2   98611750    98612249    6   gain    0.0332886037857768  0.270077169105485
2   113816500   114398999   3   gain    3.96934332204917e-17    5.55111512312578e-15
2   121103500   122122749   3   gain    1.00740734942511e-17    4.25659507641285e-13
2   128322500   128471749   3   gain    7.89316303630306e-28    0
2   218620500   219303499   3   gain    0.00830885602834e-56    0
2   220084750   220085249   6   gain    0.0232886037857768  0.270077169105485
2   220085250   220506749   3   gain    5.22993652708892e-114   0

该文件包含 7 列。我想 select 没有 header 的前 4 列,但只有那些在第 6 列中的值小于等于 0.05 的列。

我已经计算出我需要的列并且还取消了 header 但是我将如何使用第 6 列的阈值而不是在打印中使用它。我只会打印 ,,,</code> 列值小于等于 0.05.</p> <p>是否可以使用带有管道的单个 <code>awk 命令来完成此操作?

我会把它翻译成:

awk 'NR>1 && <0.05 {NF=4; print}' file

哪个returns:

1 761750 7202499 3
1 7289250 7289999 7
2 98611750 98612249 6
2 113816500 114398999 3
2 121103500 122122749 3
2 128322500 128471749 3
2 218620500 219303499 3
2 220084750 220085249 6
2 220085250 220506749 3

如果第 6 个值低于 0.05,这会从第 2 行获取所有行。如果是这样,它将通过将 NF(字段数)设置为 4 来删除额外的列。然后,它打印行。

请注意,您可以像这样将其管道美化为 column -t(感谢 Glenn 的评论!):

$ awk 'NR>1 && <0.05 {NF=4; print}' file | column -t
1  761750     7202499    3
1  7289250    7289999    7
2  98611750   98612249   6
2  113816500  114398999  3
2  121103500  122122749  3
2  128322500  128471749  3
2  218620500  219303499  3
2  220084750  220085249  6
2  220085250  220506749  3

到select前四列 $6<=0.05

awk '{if(<=0.05){print ,,,}}' file

输出

1 761750 7202499 3
1 7289250 7289999 7
2 98611750 98612249 6
2 113816500 114398999 3
2 121103500 122122749 3
2 128322500 128471749 3
2 218620500 219303499 3
2 220084750 220085249 6
2 220085250 220506749 3