awk排除不满足多个条件但满足其他条件的条目

时间:2015-10-15 18:06:39

标签: linux bash if-statement awk conditional-statements

我在我的数据中尝试包含值:

  1. 小于1的第二列;
  2. 排除条目:

    1. 第一列等于3和
    2. 第四列大于25
    3. 小于35的第四列
    4. 基本上,排除第4列和$ 1 = = 3之间介于25和35范围之间的条目。是否有一种简单的方法可以做到这一点而不会太复杂?

      类似的东西:

      awk '{OFS="\t"} {if (($2 < 1) & !($1==3 && $4>25 && $4<35)) print $0}' file.txt
      

1 个答案:

答案 0 :(得分:2)

表面上看,这应该做到:

awk 'BEGIN {OFS="\t"} {if (($2 < 1) && !($1==3 && $4>25 && $4<35)) print $0}' file.txt

就像:

awk 'BEGIN {OFS="\t"} (($2 < 1) && !($1==3 && $4>25 && $4<35)) { print $0 }' file.txt

可以进一步简化为:

awk 'BEGIN {OFS="\t"} (($2 < 1) && !($1==3 && $4>25 && $4<35)) { print }' file.txt

或:

awk 'BEGIN {OFS="\t"} (($2 < 1) && !($1==3 && $4>25 && $4<35))' file.txt

主要更改是使用BEGIN块设置OFS一次,并使用&&($1 < 1)条件与排除条件相结合。单&是一个按位运算,虽然两个项的值应该是0或1,并且按位逻辑应该有效,但它肯定不是处理它的正常方法。

实际上,由于您只是简单地打印输入记录,您甚至可能会丢失BEGIN块并使用:

awk '(($2 < 1) && !($1==3 && $4>25 && $4<35))' file.txt

如果输入中有用于分隔字段的选项卡,那么这些字段将出现在输出中。

这些脚本完全按照您在项目符号列表中所述的内容进行操作,但是您的文字显示&#39;排除了第4列&#39; 之间介于25和35之间的条目这通常被解释为拒绝值25和35(以及26..34),但它不是子弹列表所说的或代码实现的。当然,修复是微不足道的(>=<=代替><)。

您没有提供任何测试数据和预期输出 - 请以此为目标。这是一个简单的测试代码数据生成器(提供54行输出):

for h in 2 3 4
do
    for i in -1 0 1
    do
        for j in 24 25 26 34 35 36
        do
            printf "%s\t%s\t%s\t%s\n" $h $i blather $j
        done
    done
done

运行并将输出传递给显示的脚本时,输出为:

2       -1      blather 24
2       -1      blather 25
2       -1      blather 26
2       -1      blather 34
2       -1      blather 35
2       -1      blather 36
2       0       blather 24
2       0       blather 25
2       0       blather 26
2       0       blather 34
2       0       blather 35
2       0       blather 36
3       -1      blather 24
3       -1      blather 25
3       -1      blather 35
3       -1      blather 36
3       0       blather 24
3       0       blather 25
3       0       blather 35
3       0       blather 36
4       -1      blather 24
4       -1      blather 25
4       -1      blather 26
4       -1      blather 34
4       -1      blather 35
4       -1      blather 36
4       0       blather 24
4       0       blather 25
4       0       blather 26
4       0       blather 34
4       0       blather 35
4       0       blather 36

这似乎是正确的。