如何解决在awk命令shell中使用日期
我有一个与shell中的awk命令有关的问题。我们有一个具有以下值的csv输入文件:
Control_Time;Report_Name
2020-08-10;Report A
2020-06-10;Report B
2020-07-01;Report C
我的目标是检查此文件中的所有行,并仅过滤(复制)日期大于上个月第一天的行。因此,我创建了一个名为previous_month的变量,该变量如下:
previous_month=$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d)
此变量可以正常工作,但是我无法在awk语句中使用该变量,该语句要用于将数据过滤到输出文件中。
我尝试了以下语句,仅用于打印previous_month,但它不起作用。
awk -v previous_month="$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d)" '{print previous_month}'
但是,echo previous_month工作正常,它的值为2020-07-01。有什么方法可以使用此自定义变量吗? 谢谢您的所有建议!
解决方法
您接近了,请您试一下。
awk -v pre_date=$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d) '
BEGIN{
FS=OFS=";"
}
$1==pre_date
' Input_file
OP的代码尝试方面的改进:
- 我们可以创建一个
awk
变量,在其中我们可以提及date
shell命令本身,因此将OP的date
命令放入pre_date
awk变量中。 - 由于OP希望将上个月的日期与Input_file匹配,因此首先我们需要根据OP的示例Input_file将定界符设置为
;
。 - 然后,我们需要将Input_file的
$1
第一个字段与awk
变量进行比较,并检查条件是否相同,然后没有提及任何操作,因此默认情况下将打印当前行。
您的命令运行正常。 awk只是在由stdin或文件给出的行上工作。或您输入的内容。
尝试以下操作:
echo "hello world" | awk -v previous_month="$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d)" '{print previous_month}'
这将打印一次日期,因为您通过stdin提供了一行。
或
awk -v previous_month="$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d)" '{print previous_month}' filename
这将为文件中的每一行打印日期。
或
awk -v previous_month="$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d)" '{print previous_month}'
(现在输入一些内容,然后按Enter键)
每次按下Enter键,这也会打印日期。
,谢谢你们的回答。真的很有帮助!我没有意识到,我需要使用输入文件。因此,它工作正常,但我必须添加输入文件。
最终查询如下:
awk -v previous_month="$(date -d "`date +%Y%m01` -1 month" +%Y-%m-%d)" '{if ($1 > previous_month) print $0}' inputFile > outputFile;
它可以帮助其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。