使用 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
我想排除基于op
和count
列的某些行。例如 exclude op2
中 count
从 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" && $3<5 && $3>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 排除以多个字段为条件的行的主要内容,如果未能解决你的问题,请参考以下文章