【问题标题】:Delete an entire row if date is less than 50 days of current date如果日期小于当前日期的 50 天,则删除整行
【发布时间】:2017-02-05 09:30:35
【问题描述】:

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

ABC, 2017-02-03, 123, 2012-09-08   
BDC, 2017-01-01, 456, 2015-09-05    
Test, 2017-01-05, 789, 2017-02-03

我想要的输出如下。

ABC, 2017-02-03, 123, 2012-09-08
BDC, 2017-01-01, 456, 2015-09-05

注意:我有一个现有的脚本,需要将它集成到现有的脚本中。

【问题讨论】:

  • 您是否安装了gawk?你能查一下which gawk吗?
  • 哪个 gawk 返回了 /bin/gawk
  • 日期2015-09-05YYYY-MM_DD 还是YYYY-DD-MM 格式?年份、月份或日期后面是哪一个?
  • YYYY-MM_DD。示例如下。,变量也用逗号分隔。像 ABC,2017-02-03,123,2012-09-08
  • 在提供样品日期时,最好提供不会被误解的样品。 02-03 可能是 2 月 3 日或 3 月 2 日,09-08 可能是 9 月 8 日或 8 月 9 日。另一方面,02-23 只能是 2 月 23 日,09-18 只能是 9 月 18 日,因此会是更有用的示例。到目前为止,您在问题和 cmets 中提供的每个日期都是模棱两可的。

标签: shell unix awk ksh


【解决方案1】:

您可以利用date 命令执行此任务,这将简化脚本

$ awk -v t=$(date -d"-50 day" +%Y-%m-%d) '$4<t' input > output

将在输出文件中包含此内容

ABC, 2017-02-03, 123, 2012-09-08   
BDC, 2017-01-01, 456, 2015-09-05   

用你的文件名替换输入/输出

【讨论】:

  • 很好的答案。不过,这只是 GNU 日期。对于 POSIX 版本,请使用纪元时间。
【解决方案2】:

您可以使用类似下面的gawk 逻辑,

gawk '
BEGIN {FS=OFS=",";date=strftime("%Y %m %d %H %M %S")}
{
    split($4, d, "-")
    epoch = mktime(d[1] " " d[2] " " d[3] " " "00" " " "00" " " "00")
    if ( ((mktime(date) - epoch)/86400 ) > 50) print
}' file

这个想法是使用GNU Awk string functions strftime() and mtkime() 进行日期转换。前者生成YYYY MM DD HH MM SS 格式的时间戳,mktime 用于转换为EPOCH 时间。

一次两次,即当前时间戳(date)和文件中$4中的epoch转换为EPOCH,差值除以86400得到天数的差值打印那些差异较大的行50

【讨论】:

  • 感谢 Inian 的帮助,您能告诉我如何使用它吗? awk -f 文件名??
  • 对不起,Inian,我不明白。我应该提到输出文件名来代替“文件”吗?也是从哪里读取变量?我是否也应该提到“gawk”。我对此有非常基本的了解,请帮助..
  • 这创建了一个极端情况,其中当前时间戳包括今天的时间,但输入时间戳不包括在这些条件下以秒为单位进行比较时,“天”是什么意思?您应该从当前日期时间戳中删除秒数,以便使用date=strftime("%Y %m %d 0 0 0") 将“现在”的同一时间与输入进行比较。显然,为了提高效率,您还应该在 BEGIN 部​​分中调用一次mktime,而不是为每个输入行调用一次," " "00" " " "00" " " "00" 应该只是" 0 0 0"
  • @Sunny1985 输入来自文件file。当您的文件被称为sun123 时,最后一行将是}' sun123。只需尝试使用 Inian 给出的 gawk 命令行。当找不到gawk 时,您可以尝试将其替换为/usr/bin/gawk 或尝试awk。如果您希望输出文件中的结果,请将&gt; an_outputfile 附加到最后一行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多