awk可以打印没有图案的线条吗?

时间:2014-05-05 17:59:41

标签: awk

是否可以打印所有与其中一个模式不匹配的行?

换句话说,我想转换一些行,但保持其余不变。所以,如果/ pattern / matching我会提供一个自定义块来打印该行。我只需要提供一个默认的匹配器(就像其他的一样)来打印其他行。

5 个答案:

答案 0 :(得分:6)

是的,只需使用任何非零数字,awk将执行默认操作,即打印该行:

awk '7' file

如果你想把它作为“其他”,在你为特殊处理选择的任何行之后加上“next”,这样就不会为它们执行。

awk '/pattern/{special processing; next} 7' file

答案 1 :(得分:3)

您可以否定模式以获得else行为:

awk '
    /pattern/ {
        # custom block to print the line    
    }
    !/pattern/ {
        # else do other things
    }
'

答案 2 :(得分:2)

你可以这样做:

awk '/pattern/ {do something with line} 1' file

此处1将打印所有行,包括已更改的行和未更改的行。


仅显示使用Askan

发布的解决方案else if
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

答案 3 :(得分:1)

如果您使用switch

,则可以使用gawk
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

input.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

答案 4 :(得分:1)

echo -n "one\ntwo\nthree\nfour" | 
  awk '{a=1} /one/ {print 1;a=0} /three/ {print 3;a=0} a'

1
two
3
four