【问题标题】:Delete entire row if a column is older than n days如果列超过 n 天,则删除整行
【发布时间】:2017-02-05 21:53:53
【问题描述】:

如果指定列的日期早于 n 天,我需要帮助删除行。我的文件包含以下内容。从下面的文件中,我需要在第 4 列中找出当前日期少于 50 天的条目并删除整行。

ABC , 2017-02-03, 123 , 2012-09-08

BDC , 2017-01-01, 456 , 2015-09-05

测试 , 2017-01-05 , 789 , 2017-02-03

我想要的输出如下。

ABC, 2017-02-03, 123, 2012-09-08

BDC, 2017-01-01, 456, 2015-09-05

【问题讨论】:

  • 文件有多少行?如果只有几行,则可能适合有一个读取循环和一个日期命令来单独处理每一行。另一种选择可能是将文件导入 excel 或 libreoffice 等电子表格并在那里进行过滤。
  • 顺便说一句,您使用哪个操作系统? ksh 听起来像 AIX。
  • 嗨,拉斯。 AIX 就是这样。但我会尝试您在 Linux 上提供的以下脚本。您能告诉我如何将以下脚本与现有脚本集成。
  • 我看到两个选项:简单的一个:安装 GNU awk。最难的:查看stackoverflow.com/a/38319144/4086774 并尝试它是否有效。您可以根据自己的情况采用它。我不确定您是否需要 GNU date 。 (对不起,只有 GNU Linux 可用。)这可能只对小文件有用。在 AIX 和 Unix.Stackexchange 上有很多关于日期计算的帖子。许多答案指向 GNU date 或 GNU Awk 或 perl。
  • 您可能希望在此问题中添加 awk 和 aix 标签以吸引这些领域的专家。

标签: shell ksh


【解决方案1】:

如果你有可用的 GNU awk,你可以使用这个 awk 脚本:

script.awk

BEGIN { daysDiff = 50
        todayStr = strftime("%F")
        split( todayStr, da, "-" )
        cmpDate = mktime( sprintf("%d %d %d 0 0 0", 
                          da[1], da[2], da[3] - daysDiff ) )
        #cmpDateStr = strftime("%F", cmpDate)
        #print todayStr, cmpDateStr
      }

      { split( $4, da, "-" )
        dt = mktime( sprintf("%d %d %d 0 0 0", 
                     da[1], da[2], da[3] ) )
        if( dt < cmpDate) { 
            print
        }
      }

像这样使用它:awk -F, -f script.awk yourfile

【讨论】:

  • 嗨拉斯,非常感谢。但是 GNU 不可用:(
  • 嗨 Lars,我的变量用逗号分隔,正如问题中更新的那样。您可以根据脚本进行相应的更改吗?谢谢
  • @Sunny1985 通过将-F, 添加到命令来更新答案。
猜你喜欢
  • 2021-08-25
  • 2021-07-08
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多