咨询Awk脚本筛选数据行的逻辑是否正确
如何用Awk筛选满足第7列<1e-8且第8列包含大于0.2/0.3的值的行
你原来的脚本直接把||改成&&是不正确的,问题出在两个核心点:
- 逻辑运算符调整只是第一步,但你对第8列的判断逻辑完全错误——
$8 > 0.2只会提取第8列逗号前的第一个数值(也就是0.05132)来做比较,根本不会检查后面的逗号分隔值; - 就算把
||改成&&,由于第8列的判断逻辑没修复,依然无法得到符合需求的结果。
正确的Awk实现脚本
awk ' $7 < 1.0e-8 { split($8, val_arr, ",") for (idx in val_arr) { // 注:>0.2已经包含>0.3的情况,若需要包含等于0.2/0.3,可改成>=0.2 if (val_arr[idx] > 0.2) { print $0 next } } } ' test.txt
脚本工作原理
- 先判断第7列数值是否小于
1.0e-8,不满足的行直接跳过,减少无效计算; - 对满足条件的行,用
split()函数把第8列按逗号拆分为数组val_arr; - 遍历数组中的每个值,只要有一个值大于0.2(或你需要的等于/大于逻辑),就打印当前行并跳出循环处理下一行。
针对你的测试文件验证
对于你提供的test.txt两行内容:
A2 DR28 P3379 72 7 5.008 8.252e-14 0.05132,0.04248,0.002704,0.116,0.04439,0.2,0.3
A2 DR28 P3379 72 7 5.008 0.05 0.05132,0.04248,0.002704,0.116,0.04439,0.006,0.004
- 第一行第7列
8.252e-14远小于1.0e-8,且第8列包含0.2和0.3,会被正常输出; - 第二行第7列
0.05不满足<1e-8的条件,会直接被跳过,完全符合你的需求。
内容的提问来源于stack exchange,提问作者star
相关产品推荐
相关产品推荐

