
Я хочу выполнить следующие задачи:
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"
.