【问题标题】:awk to print unique latest date & time lines based on column fieldsawk 根据列字段打印唯一的最新日期和时间线
【发布时间】:2014-11-13 05:46:00
【问题描述】:

想根据第一个字段和第三个字段的最新日期和时间打印唯一行, 保留该行的最新日期和时间,并删除其他事件的重复。 大约有 5000 万行,文件未排序...

输入.csv

10,ab,15-SEP-14.11:09:06,abc,xxx,yyy,zzz
20,ab,23-SEP-14.08:09:35,abc,xxx,yyy,zzz
10,ab,25-SEP-14.08:09:26,abc,xxx,yyy,zzz
62,ab,12-SEP-14.03:09:23,abc,xxx,yyy,zzz
58,ab,22-JUL-14.05:07:07,abc,xxx,yyy,zzz
20,ab,23-SEP-14.07:09:35,abc,xxx,yyy,zzz

期望的输出:

10,ab,25-SEP-14.08:09:26,abc,xxx,yyy,zzz
20,ab,23-SEP-14.08:09:35,abc,xxx,yyy,zzz
62,ab,12-SEP-14.03:09:23,abc,xxx,yyy,zzz
58,ab,22-JUL-14.05:07:07,abc,xxx,yyy,zzz

由于文件未排序顺序的日期和时间格式,尝试了部分命令并且不完整...

awk -F, '!seen[$1,$3]++'  Input.csv

寻找您的建议...

【问题讨论】:

  • 这行20,ab,23-SEP-14.08:09:35,abc,xxx,yyy,zz在原始文件中不存在。
  • Jotne,我有两行 ID 20:20,ab,23-SEP-14.08:09:35,abc,xxx,yyy,zzz AND 20,ab,23-SEP-14.07 :09:35,abc,xxx,yyy,zzz
  • @AVN,由于文件没有按日期排序,您是否可以控制文件的日期格式?如果日期格式适合新旧版本的简单比较测试,则代码会容易得多。
  • Jotne,对不起,不,我无法更改文件的日期格式

标签: awk


【解决方案1】:

这个 awk 命令将为您完成:

awk -F, -v OFS=',' '{sub(/[.]/," ",$3);"date -d\""$3"\" +%s"|getline d}
    !($1 in b)||d>b[$1] {b[$1] =d; a[$1] = $0}
    END{for(x in a)print a[x]}' file
  • 第一行将原始$3 转换为有效的日期格式字符串,并通过date cmd 获取1970 年以来的秒数,以便我们以后进行比较。
  • 使用a and b两个数组保存最终结果和最新日期(秒)
  • END 块打印来自a 的所有行

使用您的示例数据进行测试:

kent$  cat f
10,ab,15-SEP-14.11:09:06,abc,xxx,yyy,zzz
20,ab,23-SEP-14.08:09:35,abc,xxx,yyy,zzz
10,ab,25-SEP-14.08:09:26,abc,xxx,yyy,zzz
62,ab,12-SEP-14.03:09:23,abc,xxx,yyy,zzz
58,ab,22-JUL-14.05:07:07,abc,xxx,yyy,zzz
20,ab,23-SEP-14.07:09:35,abc,xxx,yyy,zzz

kent$  awk -F, '{sub(/[.]/," ",$3);"date -d\""$3"\" +%s"|getline d}
        !($1 in b)||d>b[$1]  { b[$1] =d;a[$1] = $0 }
        END{for(x in a)print a[x]}' f
10 ab 25-SEP-14 08:09:26 abc xxx yyy zzz
20 ab 23-SEP-14 08:09:35 abc xxx yyy zzz
58 ab 22-JUL-14 05:07:07 abc xxx yyy zzz
62 ab 12-SEP-14 03:09:23 abc xxx yyy zzz

【讨论】:

  • 执行上述脚本时,收到类似警告 - date: invalid date +%s' However got the expected output From Cygwin Terminal Output for reference: date: invalid date +%s' 62,5,12-SEP-14 03:09:23,abc,xxx,yyy, zzz 58,5,22-JUL-14 05:07:07,abc,xxx,yyy,zzz 10,1,25-SEP-14 08:09:26,abc,xxx,yyy,zzz 20,1,23 -SEP-14 08:09:35,abc,xxx,yyy,zzz
【解决方案2】:

应该这样做:

sort -t , -k 3 file | awk -F, '{a[$1]=$0} END {for (i in a) print a[i]}'
62,ab,12-SEP-14.03:09:23,abc,xxx,yyy,zzz
58,ab,22-JUL-14.05:07:07,abc,xxx,yyy,zzz
10,ab,25-SEP-14.08:09:26,abc,xxx,yyy,zzz
20,ab,23-SEP-14.08:09:35,abc,xxx,yyy,zzz

【讨论】:

  • 感谢 Jotne ,对于 ID 20 ,预期输出行是 20,ab,23-SEP-14.08:09:35,abc,xxx,yyy,zzz 这是最新记录
  • @AVN 然后你需要根据date字段对数据进行排序,然后再用这个命令处理它。查看我更新的帖子。
猜你喜欢
  • 2015-01-08
  • 2018-09-05
  • 1970-01-01
  • 2021-02-15
  • 2013-12-12
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 2022-01-05
相关资源
最近更新 更多