对特定的日期列进行排序并获取最早的日期

时间:2017-02-01 09:02:02

标签: linux shell ksh

需要帮助从下面的输出中排序第4列,并仅报告具有最早日期的条目。

当前输出:

Node_name:ABCD Lastacc  :2017-01-05 Info     :testing *Endtime  :2016-12-11* Type     :Exist
Node_name:ABCD Lastacc  :2017-01-05 Info     :testing *Endtime  :2016-12-11* Type     :Exist
Node_name:ABCD Lastacc  :2017-01-05 Info     :testing *Endtime  :2016-12-15* Type     :Exist

预期产出:

Node_name:ABCD Lastacc  :2017-01-05 Info     :testing *Endtime  :2016-12-15* Type     :Exist

3 个答案:

答案 0 :(得分:1)

sort -k7 -r your_file.log | head -n 1

-k7:由于您的示例输出在bash中用空格分隔,因此必须按第七列(:2016-12-11)进行排序。

-r:反转输出,因此最新(=最新)日期位于第一行。如果你真的对最早(=最老)的日期感兴趣,请将其删除。

答案 1 :(得分:0)

下面将按升序排序,并将grep文件的最后一行

sort -k3你的文件| tail -n 1

答案 2 :(得分:0)

基于排序和获取第一行/最后一行(取决于排序顺序)的解决方案将起作用。

如果你有大量的数据,那么排序的计算密集程度要高得多:因为你只想要最新的一行,你可以简单地解析每一行,扫描整个文件,并保持最新的内存(不需要)排序其他人。)

可以这样做。

#!/bin/bash
data_file="data_file"
regex="Endtime :([0-9-]+)"
while IFS= read -r line
do
  [[ $line =~ $regex ]] || continue
  match="${BASH_REMATCH[1]}"
  [[ "$match" < "$newest" ]] || { newest="$match" ; newest_line="$line" ; }
done <"$data_file"
echo "$newest_line"

对于您的具体情况,很可能单线sort/cut解决方案足够快,在这种情况下,更短更好,但在十亿行文件中,将有一个通过选择合适的算法来获得巨大的性能差异。

请注意,用于读取日期的正则表达式是粗略的,并假设日期将全部采用相同的有效格式(允许直接比较而无需进一步解析)。有人可能更愿意更改该表达式以更仔细地匹配YYYY-MM-AA格式。