Awk中OR逻辑条件判断失效问题求助
问题分析与解决办法
嘿,我立刻就发现你遇到的问题啦!你的Awk条件逻辑搞反了,导致它实际上匹配了所有行。
为什么原来的||条件不生效?
你写的条件$15 <= 1000 || $15 >= -1000对所有整数都成立,不管$15的值是多少:
- 如果
$15是正数(比如2000),它不满足<=1000,但肯定满足>= -1000; - 如果
$15是负数(比如-2000),它不满足>= -1000,但肯定满足<=1000; - 根本不存在既大于1000又小于-1000的数,所以这个条件永远为真,自然返回文件的总行数1188。
正确的写法
你想要的应该是距离的绝对值不超过1000,也就是$15在-1000到1000之间,这时候需要用逻辑与(&&)而不是逻辑或(||):
closest-features --closest --no-overlaps --delim ' ' --dist --ec megatrans_enhancers.sorted.bed ../../data/alu_repeats.sorted.bed | awk -v OFS=' ' '{if ($15 >= -1000 && $15 <= 1000) print $0}' | wc -l
或者用更简洁的方式,利用Awk的abs()函数直接判断绝对值:
closest-features --closest --no-overlaps --delim ' ' --dist --ec megatrans_enhancers.sorted.bed ../../data/alu_repeats.sorted.bed | awk -v OFS=' ' 'abs($15) <= 1000' | wc -l
注:
abs()是GNU Awk(gawk)的内置函数,如果你用的是POSIX标准的Awk,可以自己简单实现:function abs(x) { return x < 0 ? -x : x }
用你提供的示例输入测试的话,像-2050、-7909这类绝对值超过1000的行会被过滤掉,而-22、76、642这些符合条件的行会被保留,结果会符合你的预期。
内容的提问来源于stack exchange,提问作者dddxxx
相关产品推荐
相关产品推荐

