1

好的,这很可能对你来说听起来像是一个愚蠢的问题,但我无法让它发挥作用,即使在阅读了很多 nawk/awk 帮助网站之后,我也不知道我在这里做错了什么:

    $ echo -e "hey\nthis\nworld" | nawk '{ if ( $1 !~ /e/ ) { print $0; } else if ($1 !~ /o/ ) { print $0; } else { print "condition not mached"; } }'
    hey
    this
    world
    $ 

我更喜欢将它放在一行上,但也尝试在多行上,如各种示例中所示:

    $ echo -e "hey\nthis\nworld" | nawk '{ 
    if ( $1 !~ /e/ )
    print $0;
    else if ($1 !~ /o/ )
    print $0;
    else
    print "condition not matched"
    }'
    hey
    this
    world
    $ 

在此先感谢您帮助一个新手!

我只想打印不包含特定模式的行,这里是“e”或“o”。最后的 else 我只是为了测试目的而添加的。

4

2 回答 2

0

您只需执行以下操作即可使您的生活更轻松:

echo "hey\nthis\nworld" | nawk '$1 !~ /e|o/'

你的情况出了什么问题:

$ echo -e "hey\nthis\nworld" | nawk '{ 
if ( $1 !~ /e/ ) #'this' and 'world' satisfy this condition and so are printed 
print $0; 
else if ($1 !~ /o/ ) #Only 'hey' falls through to this test and passes and prints
print $0;
else
print "condition not matched"
}'
hey
this
world
$ 
于 2014-09-05T13:55:50.130 回答
0

FWIW 正确的方法是在三元表达式中使用字符列表:

awk '{ print ($1 ~ /[eo]/ ? $0 : "condition not matched") }'

展望未来,如果您使用awk而不只是nawk(这是一个旧的、非 POSIX 且相对冗余的 awk 变体)标记您的问题,它们将覆盖更广泛的受众。

于 2016-04-12T02:40:56.630 回答