从部分字符串中找到最大值

时间:2016-09-12 21:01:45

标签: shell unix awk

我有一个列表,其中前6位是yyyymmdd格式的日期。接下来的4位数是时间戳的一部分。我想只选择那些任何一天最大时间戳的数字。

20160905092900
20160905212900
20160906092900
20160906213000
20160907093000
20160907213000
20160908093000
20160908213000
20160910093000
20160910213100
20160911093100
20160911213100
20160912093100

从上面的列表中表示输出应该给出以下列表。

20160905212900
20160906213000
20160907213000
20160908213000
20160910213100
20160911213100
20160912093100

2 个答案:

答案 0 :(得分:1)

$  sort -r file | awk '!seen[substr($0,1,8)]++' | sort
20160905212900
20160906213000
20160907213000
20160908213000
20160910213100
20160911213100
20160912093100

如果文件已经排序,您可以使用tac代替sort

答案 1 :(得分:0)

您可以使用awk:

awk '{
   dt = substr($0, 1, 8)
   ts = substr($0, 9, 12)
}
ts > max[dt] {
   max[dt] = ts
   rec[dt] = $0
}
END {
   for (i in rec)
      print rec[i]
}' file    

20160905212900
20160906213000
20160907213000
20160908213000
20160910213100
20160911213100
20160912093100

我们正在使用关联数组max,它使用前8个字符作为键,后4个字符作为值。此数组用于存储给定日期的最大时间戳值。当我们遇到时间戳值大于rec数组中的存储值时,另一个数组max用于存储日期的完整行。