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