根据线之间的比例保持线条

时间:2016-09-08 08:37:39

标签: bash sorting awk

我在一个文件上有sort -g k9命令,在bash标准输出中给出了这个命令:

55.19   645 156 15  9   520 58  702 0.0  661
55.50   636 159 16  9   520 58  693 0.0  654
55.19   645 156 15  9   520 58  702 0.0  658
56.52   644 147 16  9   520 59  701 0.0  669
55.97   645 151 15  9   520 65  709 0.0  672
55.97   645 151 15  9   520 65  709 4e-124   674
28.32   671 301 32  1   507 48  702 3e-49    183
28.32   671 301 32  1   507 47  701 3e-49    183
31.40   516 247 24  86  507 196 698 1e-46    176
31.41   519 243 25  86  507 196 698 5e-46    175
27.72   588 290 26  19  481 98  675 2e-39    154
30.56   337 170 17  101 413 302 598 5e-20   96.3
30.56   337 170 17  101 413 302 598 8e-20   95.5

我想根据第9列剪切数据。我们的想法是比较 i 行第9列的值,除以 i + 1 行第9列的值,如果比率为0或0/0 OR>保留1e-50 ,行 i i + 1 。只要其中一个条件未填满,请停止阅读。所需的输出是:

55.19   645 156 15  9   520 58  702 0.0  661
55.50   636 159 16  9   520 58  693 0.0  654
55.19   645 156 15  9   520 58  702 0.0  658
56.52   644 147 16  9   520 59  701 0.0  669
55.97   645 151 15  9   520 65  709 0.0  672
55.97   645 151 15  9   520 65  709 4e-124   674

我可以使用head -n 6获取此输出,但这显然不是基于第9列中值的条件。请注意,值为“科学”格式。

我知道如何在Python中执行此操作(将标准输出写入文件,计算比率等)但出于商品原因,我更喜欢基于shell的解决方案(awk或{{1例如)虽然我不知道这是否可能。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

在条件未完成时退出脚本;否则,打印上一行并存储第9个字段以在下一个循环中进行比较:

$ awk '($9 && prev/$9>1e-50) {exit} {print stored; prev=$9; stored=$0}' file

55.19   645 156 15  9   520 58  702 0.0  661
55.50   636 159 16  9   520 58  693 0.0  654
55.19   645 156 15  9   520 58  702 0.0  658
56.52   644 147 16  9   520 59  701 0.0  669
55.97   645 151 15  9   520 65  709 0.0  672
55.97   645 151 15  9   520 65  709 4e-124   674