您好我想从匹配特定模式的文件中删除一行 我正在使用的代码是

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')。

修复后,您应该删除正确的行。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top