我正在尝试读取包含以下数据的文本文件:
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:%F
shell 代码;该方法仅在脚本中有用#! /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
为 来将其应用于任何字段(以在列上进行过滤)。 ()将(接受)今天注册的所有学生。要拒绝它们,您可以使用或两者都提供相同的逻辑结果。$3
3
==
filter in
$NF != value
!($NF == value)
要匹配的值可以是[today]
orDate:[today]
或Date:2022-06-21
or 任何所需的值。只需使变量的内容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
任何地方的字符串,例如,它可能用于匹配“今年”)。