使用 awk 排除以多个字段为条件的行

Posted

技术标签:

【中文标题】使用 awk 排除以多个字段为条件的行【英文标题】:Excluding lines conditional upon multiple fields with 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 块并取反。 【参考方案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

【讨论】:

以上是关于使用 awk 排除以多个字段为条件的行的主要内容,如果未能解决你的问题,请参考以下文章

awk 条件及循环语句

awk

AWK

awk

awk编辑器

awk的基本用法