【问题标题】:Excluding lines conditional upon multiple fields with awk使用 awk 排除以多个字段为条件的行
【发布时间】:2018-05-01 12:50:03
【问题描述】:

我有一个非常简单的awk 问题:

我有以下文件test1.txt

ids op  count
id1 op1 1
id7 op1 2
id13    op1 3
id4 op1 4
id10    op1 5
id11    op2 1
id2 op2 2
id8 op2 3
id14    op2 4
id5 op2 5

我想排除基于opcount 列的某些行。例如 exclude op2count 从 2 到 5 的任何内容,最后给我以下 test2.txt

ids op  count
id1 op1 1
id7 op1 2
id13    op1 3
id4 op1 4
id10    op1 5
id11    op2 1
id5 op2 5

我正在寻找可以执行以下操作的 awk 代码:

awk '{
    if($2 ~ /op2/ && $3>1 && $3<5)
    skip
    else
    print $0
    }' test1.txt > test2.txt

这段代码确实有效。但我感谢任何关于 1 班轮的建议。

非常感谢!

【问题讨论】:

  • 嗯,上面的代码实际上似乎适用于这个例子......
  • 将条件移出 if 块并取反。

标签: bash awk


【解决方案1】:

就这么简单:

awk 'NR==1 || !($2=="op2" && $3<5 && $3>1)' test.file

请注意,awk 程序基本上具有以下形式:

CONDITION { ACTIONS }

默认操作是print。这意味着如果条件扩展为 true 并且您未指定任何操作,则 awk 将打印输入行。

逻辑意思是:

打印所有符合两个以下条件的行

  • op==op2
  • 2 = 5

【讨论】:

  • 好吧,这段代码只给了我 1 行:id5 op2 5 而不是范围。另外我想排除满足条件的东西不要提取它们。
  • 是的,实际上我的代码也可以工作——大声笑......但我很感激你的回答。不过,您的条件不正确,$2=="op2" &amp;&amp; $3&lt;5 &amp;&amp; $3&gt;1 给出了我正在寻找的内容。
【解决方案2】:

另一个awk单线

$ awk '$2!="op2" || 2>$3 || $3>4' file

ids op  count
id1 op1 1
id7 op1 2
id13    op1 3
id4 op1 4
id10    op1 5
id11    op2 1
id5 op2 5

【讨论】:

    【解决方案3】:

    如果你想要一个在线人,试试:

    awk '($2 != "op2") || ($3 <= 1) || ($3 >= 5) { print }' test1.txt > test2.txt
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 2022-01-08
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多