【发布时间】:2019-03-08 00:07:01
【问题描述】:
awk 可以打印所有与其中一种模式不匹配的行吗?
换句话说,我想转换一些线条,但保持其余部分不变。因此,如果 /pattern/ 匹配,我将提供一个自定义块来打印该行。我只需要提供一个默认匹配器(如 else)来打印其他行。
【问题讨论】:
-
你最好举个例子,你喜欢什么。声望 600 分,你应该知道这有多重要。
标签: awk
awk 可以打印所有与其中一种模式不匹配的行吗?
换句话说,我想转换一些线条,但保持其余部分不变。因此,如果 /pattern/ 匹配,我将提供一个自定义块来打印该行。我只需要提供一个默认匹配器(如 else)来打印其他行。
【问题讨论】:
标签: awk
是的,只要使用任何非零数字,awk 就会执行其默认操作,即打印该行:
awk '7' file
如果您希望它作为“else”,请将“next”放在您选择进行特殊处理的任何行之后,这样就不会为它们执行这一行。
awk '/pattern/{special processing; next} 7' file
【讨论】:
7 是注册商标。
您可以否定该模式以获得else 类似的行为:
awk '
/pattern/ {
# custom block to print the line
}
!/pattern/ {
# else do other things
}
'
【讨论】:
next 放在找到的块中,则另一个块将是未找到的块。 awk '/pattern/ {do this;next} {else this block will be run}'。在您的示例中,两个测试都将始终运行,并且可能会减慢程序的速度。
!/pattern/ 表单在以下情况下很方便:awk '/^IpExt/ && !/Mcast/ {print $4}' /proc/net/netstat。换句话说,它会找到与某个模式匹配的行,然后排除与另一个模式匹配的行。
你可以这样做:
awk '/pattern/ {do something with line} 1' file
这里1 将打印所有行,包括已更改和未更改的行。
只是为了展示使用else if发布的解决方案Askan
awk '{
if (/pattern/)
print "Line number:",NR,"pattern matched"
else if (/Second/)
print "Line number:",NR,"Second matched"
else
print "Line number:",NR,"Another line matched"
}' file
【讨论】:
例如,如果您使用gawk,则可以使用switch
awk '{switch ($0) {
case /pattern/:
print "Line number:",NR,"pattern matched"
break
case /Second/:
print "Line number:",NR,"Second matched"
break
default:
print "Line number:",NR,"Another line matched"
}}' input.txt
输入.txt
This line matches the pattern
Second line does not match
Hello
This line also matches the pattern
Another line
输出:
Line number: 1 pattern matched
Line number: 2 Second matched
Line number: 3 Another line matched
Line number: 4 pattern matched
Line number: 5 Another line matched
您还可以通过删除它们之间的break 来对案例进行分组。 more info
【讨论】:
switch 函数。大多数人倾向于使用if else if else。查看我更新的帖子。
gnu awk
echo -n "one\ntwo\nthree\nfour" |
awk '{a=1} /one/ {print 1;a=0} /three/ {print 3;a=0} a'
1
two
3
four
【讨论】: