您好我想从匹配特定模式的文件中删除一行 我正在使用的代码是
BEGIN {
FS = "!";
stopDate = "date +%Y%m%d%H%M%S";
deletedLineCtr = 0; #diagnostics counter, unused at this time
}
{
if( $7 < stopDate )
{
deletedLineCtr++;
}
else
print $0
}
代码说该文件有“!”行分隔和第7个字段是日期yyyymmddhhmmss格式。该脚本删除日期小于系统日期的行。但这不起作用。任何人都可以告诉我原因吗?
答案 0 :(得分:2)
好的,我不确定你到底发生了什么,所以我做了一些猜测。这个awk程序获取当前时间,然后删除文件中的每一行少于该行。我留下了一个调试打印。
BEGIN {
FS = "!"
stopDate = strftime("%Y%m%d%H%M%S")
print "now: ", stopDate
}
{ if ($7 >= stopDate) print $0 }
$ cat t2.data
!!!!!!20080914233848
!!!!!!20090914233848
!!!!!!20100914233848
$ awk -f t2.awk < t2.data
now: 20090914234342
!!!!!!20100914233848
$
答案 1 :(得分:1)
首先调用date
将格式化日期作为参数传递:
awk -F'!' -v stopdate=$( date +%Y%m%d%H%M%S ) '
$7 < stopdate { deletedLineCtr++; next }
{print}
END {do something with deletedLineCrt...}
'
答案 2 :(得分:0)
您可能需要运行date命令 - 可能需要使用反引号 - 来将日期转换为stopDate。如果您使用所写的代码打印stopDate,它将包含“date + ...”,而不是一串数字。这是你问题的根本原因。
我找不到任何证据表明反引号适用于任何版本的awk(旧awk,新awk,GNU awk)。因此,您需要将代码迁移到Perl(Perl最初被设计为'awk-killer' - 并且仍然包含a2p
以将awk脚本转换为Perl),或者您需要重新考虑如何设置日期
看到@ DigitalRoss的回答,strftime()
中的gawk
函数为您提供了所需的格式(请按照我的方式检查'info gawk')。
修复后,您应该删除正确的行。