awk打印独特的最新日期&基于列字段的时间线

时间:2014-11-12 17:29:32

标签: awk

想要根据第一个字段和最新日期&amp ;;打印独特的行。第三场的时间, 保留该行的最新日期和时间,并删除其他事件的重复。 拥有大约5000万行,文件没有排序......

Input.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

寻找你的建议......

2 个答案:

答案 0 :(得分:2)

这个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转换为有效的日期格式字符串,并从1970年到date cmd获取秒数,以便我们稍后进行比较。
  • 使用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

答案 1 :(得分:0)

这应该做:

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