У меня есть файл, содержащий строки в следующем формате:более одного состояния в AWK
<firstname> <lastname> <day_of_birth> <month_of_birth> <year_of_birth>
Мне нужно, чтобы отобразить пользователей, празднующих свой день рождения на текущую дату.
Мне удалось написать сценарий, но только если проверить день == текущий день.
Как я могу написать строку с awk, где я проверю, $ 3 == day, также проверяя, 4 $ = месяц и $ 5 == год? Спасибо
# get current date: day, month, year
day="$(date +'%d')"
month="$(date +'%m')"
year="$(date +'%Y')"
birthdays=$(awk "\$3~/$day/ {print \$1, \$2;}" users.lst)
echo $birthdays
Если вы планируете использовать GetLine , убедитесь, что вы готовы и полностью понимаете все предостережения, описанные в http://awk.info/?tip/getline. Лично я бы не использовал getline для этого, кроме YMMV. –
@EdMorton Спасибо за комментарий. На странице http://awk.info/?tip/getline сказано: 'getline - это подходящее решение для чтения из трубы. Однако, интересно, вы видите проблемы здесь? Например, если трубы должны быть закрыты перед доступом к переменным «день», «месяц» и «год». Или мы можем полагаться на то, что они имеют четко определенное значение, даже если труба не закрыта? –
getline - подходящее решение для чтения для трубы, но в этом случае нет причин для чтения из трубы, в отличие от, скажем, когда вы читаете данные из файла с помощью awk и считаете полезным вызвать команду оболочки для работы по этим данным, а затем используйте getline для чтения результата, а затем продолжите обработку в awk. Да, трубы всегда должны быть закрыты, как только вы закончите с каждым из них (например, 'cmd =" date +% d "; cmd | getline day; close (cmd)'), я не уверен, какие последствия не делают этого в этом случае - я просто делаю это, поэтому мне не нужно читать о том, почему. –