Оператор else-if в Awk, похоже, выполняется дважды

Оператор else-if в Awk, похоже, выполняется дважды

Я хочу выполнить следующие задачи:

1) вывести слово, если количество слов в строке = 1

2) вывести 4-е слово, если количество слов в строке > 3

3) во всех остальных случаях печатать пустую строку

Входной файл:

cat file.txt
Hi there I welcome you
Hi there You
Hi
Hi there
Hi there I welcome you all

Ожидаемый результат:

welcome

Hi

welcome

Когда я использую приведенный ниже код, он выдает мне на выходе дополнительную пустую строку, чего я не ожидал.

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print "\n"} }'
welcome


Hi


welcome

Я решил эту проблему, используя приведенный ниже код.

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print $10000} }'
welcome

Hi

welcome

Однако я хочу понять, что пошло не так и почему еще оператор выполняется дважды и дает неожиданный результат?

решение1

Это потому, что printоператор по умолчанию добавляет новую строку в конец строки, которую он печатает. При использовании с \nним печатается двойной символ новой строки, как вы видите в выводе. printfВместо этого используйте

awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else printf "\n" }' file

Без явных конструкций ветвления if..else if..elseвы можете просто сделать

awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'

решение2

Команда printвсегда добавляет новую строку. Поэтому print "\n"печатает указанную вами новую строку плюс ту, которую она добавила.

Вы можете использовать print ""или printf "\n".

Связанный контент