【问题标题】:More than one condition in awkawk 中的多个条件
【发布时间】:2014-01-20 00:56:47
【问题描述】:

我有一个包含以下格式行的文件:

<firstname> <lastname> <day_of_birth> <month_of_birth> <year_of_birth>

我需要显示在当前日期庆祝生日的用户。

我设法编写了脚本,但只是通过检查日期是否 == 当天。

如何使用 awk 编写检查 $3 == day 的行,同时检查 $4 == month 和 $5 == year 的行?谢谢

# 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

【问题讨论】:

    标签: linux awk


    【解决方案1】:

    你不能像这样在 awk 中只使用 shell 变量。它可能会产生很多问题。您需要使用 -v awk_var=$shell_var 选项将 shell 变量传递给 awk。

    你可以使用这个 awk 命令:

    awk -v d=$day -v m=$month -v y=$year '$3==d && $4==m && $5==y {print $1, $2}' users.lst
    

    但是请注意GNU awk has built-in date/time functions,您可以避免在 awk 之前调用 date 命令 3 次,如下所示:

    awk '$3==strftime("%d") && $4==strftime("%m") && $5==strftime("%Y")
         {print $1, $2}' users.lst
    

    【讨论】:

      【解决方案2】:

      您没有发布任何示例输入,所以这是一个猜测,但这可能是您想要的:

      awk -v date=$(date "+%d/%m/%Y") '$3"/"$4"/"$5 == date {print $1, $2}' file
      

      【讨论】:

        【解决方案3】:

        您可以从 within awk 获取当前日期,如下所示:

        awk 'BEGIN {
            "date +%d" | getline day
            "date +%m" | getline month
            "date +%Y" | getline year        
        }
        $3==day && $4==month && $5==year {
           print $1,$2
        }' users.lst
        

        【讨论】:

        • 如果您正在考虑使用 getline,请确保您已准备好并完全理解 awk.info/?tip/getline 中描述的所有注意事项。就个人而言,我不会为此使用 getline,而是使用 YMMV。
        • @EdMorton 感谢您的评论。在awk.info/?tip/getline 它说getline is an appropriate solution for reading from a pipe。但是,我想知道,您在这里看到任何问题吗?例如,在访问变量daymonthyear 之前是否应该关闭管道。或者即使管道没有关闭,我们是否可以依赖它们具有明确定义的值?
        • getline 是读取管道的合适解决方案,但在这种情况下,没有理由从管道读取,这与使用 awk 从文件读取数据并发现它有用时不同调用一些 shell 命令对该数据进行操作,然后使用 getline 读取结果,然后在 awk 中继续处理。是的,一旦你完成了每个管道(例如cmd="date +%d"; cmd | getline day; close(cmd)),管道应该始终关闭,我不确定在这种情况下不这样做的后果是什么 - 我只是这样做,所以我不这样做'不需要了解原因。
        【解决方案4】:

        这是另一种方法:

        awk '$3=="'$(date +%d)'"&&$4=="'$(date +%m)'"&&$5=="'$(date +%Y)'"{print $1,$2}' users.lst
        

        【讨论】:

          猜你喜欢
          • 2015-01-18
          • 1970-01-01
          • 2012-12-05
          • 2020-09-20
          • 1970-01-01
          • 2019-06-14
          • 1970-01-01
          • 1970-01-01
          • 2011-10-27
          相关资源
          最近更新 更多