【问题标题】:sort a specific column of date and get the earliest date对日期的特定列进行排序并获取最早的日期
【发布时间】:2017-02-01 09:02:01
【问题描述】:

需要帮助从下面的输出中对第 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

【问题讨论】:

  • 哪一个是您的第四栏?编辑您的问题并添加更多详细信息

标签: linux shell ksh


【解决方案1】:

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

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

-r:反转输出,因此最新(=最新)日期在第一行。如果您确实对最早(=最旧)日期感兴趣,请将其删除。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      如果你有很多数据,排序的计算量比所需的要多:因为你只想要最新的行,你可以简单地解析每一行,扫描整个文件,并将最新的保留在内存中(不需要对其他人进行排序)。

      可以这样。

      #!/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 格式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-25
        相关资源
        最近更新 更多