2014-09-05 2 views
1

ОК, это, скорее всего, будет звучать как глупый вопрос к вам, но я не могу заставить его работать и действительно не знаю, что я делаю неправильно здесь, даже после прочтения довольно много nawk/AWK сайты помогают:«nawk if else if else» не работает

$ 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». Последнее, что я добавил только для целей тестирования.

ответ

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 
$ 
+0

спасибо Ell! теперь я вижу свое недоразумение в if-construct. – hermann

0

FWIW правильный способ сделать это с характером список внутри троичного выражения:

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

Идущий вперед, если вы помечать вопросы с awk вместо nawk (который является старым, не относящимся к POSIX и относительно избыточным вариантом awk), они достигнут гораздо более широкой аудитории.