AWK 检查日期,如果是今天,则仅过滤该内容

AWK 检查日期,如果是今天,则仅过滤该内容

我正在尝试读取包含以下数据的文本文件:

LNAME FNAME MNAME MAJOR DATE
Smith Jane Chem  Date:[somedate]
Doe Joanne Victoria ENG Date:[today]

在此示例中,[somedate] 表示除今天之外的任何日期,[today] 表示今天的日期。我的想法是使用 awk 过滤掉今天注册的所有学生。日期格式如下所示:2022-06-21。

任何帮助,将不胜感激

答案1

grep -v "Date:$(date +%F)\$" < file

将返回不Date:以 YYYY-MM-DD 格式结尾的当前日期的行。

如果使用zsh,您可以执行此操作,而无需使用以下命令调用date

grep -v Date:${(%):-%D{%F}}$ < file

GNU 实现awk也可以自己获取当前日期:

gawk 'BEGIN {search = strftime("Date:%F")}
      $NF != search' < file

将返回最后一个空白分隔字段不是 的行Date:[today]

改成:

gawk 'BEGIN {search = strftime("Date:%F")}
      NR == 1 || $NF != search' < file

还可以打印标题。

awk在不是 GNU 的系统上awk,您可以执行以下操作:

awk -v search="$(date +Date:%F)" '
  NR == 1 || $NF != search' < file

或者:

awk 'BEGIN {"date +Date:%F" | getline search}
     NR == 1 || $NF != search' < file

(尽管该方法运行额外的 shell 调用来解释该date +Date:%Fshell 代码;该方法仅在脚本中有用#! /usr/bin/awk -f)。

如果输入可以解析为某种以空格作为分隔符的 csv,您还可以使用 csvkit 的csvgrep

<file csvgrep -d ' ' -c DATE -r "$(date +'^Date:%F$')"

这里是场上的匹配DATE

但输出是逗号分隔值。您可以通过管道将分隔符更改回空格而不是逗号csvformat -D ' '

答案2

这对我有用:

awk -F'[ :]' -v dt="$(date +'%F')" '$NF != dt' filename
  • -F'[ :]'告诉 awk 使用空格或冒号作为字段分隔符
  • -v告诉 awk 使用以下内容作为变量
  • dt="$(date +'%F')"设置dt为 YYYY-MM-DD 格式的当前日期
  • '$NF != dt'说“如果最后一个字段等于当前日期,则忽略此行”

答案3

获取当前日期 with命令替换 并比较 $NF:

awk -F, -v date="$(date +%F)" '$NF == date' FILE

答案4

一般来说,要过滤 AWK 中的最后一个字段,您应该使用$NF == "text"or 使其更加通用:$NF == value其中 value 是具有适当内容的变量。例如,可以通过更改$NF为 来将其应用于任何字段(以在列上进行过滤)。 ()将(接受)今天注册的所有学生。要拒绝它们,您可以使用或两者都提供相同的逻辑结果。$33==filter in$NF != value!($NF == value)

要匹配的值可以是[today]orDate:[today]Date:2022-06-21or 任何所需的值。只需使变量的内容value完全等于您需要的内容,此 awk 命令就会“过滤掉”具有该值的行。假设字段分隔符是制表符:

awk -v value="Date:[2022-06-21]" '$NF != value' infile

-F","如果字段分隔符是逗号,则添加 a。

要获取今天的日期,如果使用 bash (4.3+) 或 ksh (93),则可以使用 shell:

printf -v value 'Date:[%(%F)T]'
awk -v value="$value" '$NF != value' infile

如果脚本的第一行是标题,并且您希望打印它,请添加:

printf -v value 'Date:[%(%F)T]'
awk -v value="$value" '($NF != value) || (NR==1)' infile

或者,在任何 shell 中:

value="Date:[$(date +'%F')]"
awk -v value="$value" '($NF != value) || (NR==1)' infile

在 awk 的某些版本中,可以直接获取日期:

awk 'BEGIN{ value = "Date:[" strftime("%F") "]" } ($NF != value) || (NR == 1)' infile

==将进行需要精确的字符串比较。一个相关的测试是正则表达式匹配~(或否定!~),它可以允许不太严格的匹配($NF ~ /2022/将匹配任何包含2022任何地方的字符串,例如,它可能用于匹配“今年”)。

相关内容