【问题标题】:how can i sort the content of a file by date?如何按日期对文件内容进行排序?
【发布时间】:2016-04-24 17:48:38
【问题描述】:

我有一个包含下一个内容的文件:

linux-4.4.1.tar.gz      31-Jan-2016 19:34  127M
linux-4.4.2.tar.gz      17-Feb-2016 20:35  127M
linux-4.4.3.tar.gz      25-Feb-2016 20:13  127M
linux-4.4.4.tar.gz      03-Mar-2016 23:16  127M
linux-4.4.5.tar.gz      09-Mar-2016 23:44  127M
linux-4.4.6.tar.gz      16-Mar-2016 16:28  127M
linux-4.4.7.tar.gz      12-Apr-2016 16:13  127M
linux-4.4.8.tar.gz      20-Apr-2016 07:00  127M
linux-4.4.tar.gz        10-Jan-2016 23:12  127M
linux-4.5.1.tar.gz      12-Apr-2016 16:08  128M
linux-4.5.2.tar.gz      20-Apr-2016 07:00  128M
linux-4.5.tar.gz        14-Mar-2016 04:38  128M

我想按日期过滤此内容,但我不确定我该怎么做,到目前为止,我只有以下代码来转换日期以进行比较,但我不确定如何使用它bash 代码以过滤文件:

date -d 20-Apr-2016 +"%Y%m%d"

【问题讨论】:

  • 不确定您是如何生成文件的。如果它带有“ls”,则可以选择按日期对其进行排序 - 参见“man ls”。顺便提一句。过滤减少行,排序排序。你的问题听起来像是排序而不是过滤......

标签: linux bash ubuntu terminal


【解决方案1】:

Schwartzian transform:

while read -r line; do
  d=$(date -d "${line:24:11}" +"%Y%m%d")
  echo "$d $line"
done < file | sort -k1,1n | cut -d " " -f 2-

输出:

linux-4.4.tar.gz 2016 年 1 月 10 日 23:12 127M linux-4.4.1.tar.gz 2016 年 1 月 31 日 19:34 127M linux-4.4.2.tar.gz 2016 年 2 月 17 日 20:35 127M linux-4.4.3.tar.gz 25-Feb-2016 20:13 127M linux-4.4.4.tar.gz 03-Mar-2016 23:16 127M linux-4.4.5.tar.gz 09-Mar-2016 23:44 127M linux-4.5.tar.gz 14-Mar-2016 04:38 128M linux-4.4.6.tar.gz 16-Mar-2016 16:28 127M linux-4.4.7.ta​​r.gz 2016 年 4 月 12 日 16:13 127M linux-4.5.1.tar.gz 2016 年 4 月 12 日 16:08 128M linux-4.4.8.tar.gz 2016 年 4 月 20 日 07:00 127M linux-4.5.2.tar.gz 2016 年 4 月 20 日 07:00 128M

【讨论】:

  • 不错的一个。但是24:11的假设有点危险,不是吗
  • 好的,让它更健壮:[[ $line =~ [^" "]*" "*([^" "]*)" "[^" "]*" "[^" "]* ]]; d=$(date -d "${BASH_REMATCH[1]}" +"%Y%m%d")。我假设他没有使用标签。
【解决方案2】:

如果对perl 开放,那么最好在其中实现施瓦茨变换。这使用了一个核心模块,因此无需从 CPAN 安装一个。

perl -MTime::Piece -lane'
    push @rows, [ $_,  join (" ", $F[1], $F[2]) ];
}{
    print for
      map  { $_->[0] }
      sort {
          Time::Piece->strptime($a->[1], "%d-%b-%Y %R") <=>
          Time::Piece->strptime($b->[1], "%d-%b-%Y %R")
      }
      map  { [ $_->[0], $_->[1] ] } @rows;
' file
linux-4.4.tar.gz        10-Jan-2016 23:12  127M
linux-4.4.1.tar.gz      31-Jan-2016 19:34  127M
linux-4.4.2.tar.gz      17-Feb-2016 20:35  127M
linux-4.4.3.tar.gz      25-Feb-2016 20:13  127M
linux-4.4.4.tar.gz      03-Mar-2016 23:16  127M
linux-4.4.5.tar.gz      09-Mar-2016 23:44  127M
linux-4.5.tar.gz        14-Mar-2016 04:38  128M
linux-4.4.6.tar.gz      16-Mar-2016 16:28  127M
linux-4.5.1.tar.gz      12-Apr-2016 16:08  128M
linux-4.4.7.tar.gz      12-Apr-2016 16:13  127M
linux-4.4.8.tar.gz      20-Apr-2016 07:00  127M
linux-4.5.2.tar.gz      20-Apr-2016 07:00  128M

【讨论】:

    【解决方案3】:

    如果您习惯使用 GNU AWK,那么这样的脚本就可以了:

    conv_date.awk

    BEGIN   { # sort array numerically
            PROCINFO["sorted_in"] = "@ind_num_asc"
            # prepare a mapping month name to month-number:
            split("JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC", tmp," ")
            for( ind in tmp ) { monthMap [ tmp[ ind ] ] = ind }
          }
    
          { split( $2, dt, /[-]/)
            ts = mktime( dt[3] " " monthMap[ toupper( dt[2]) ] " " dt[1] " 0 0 0" )
            if (ts in lines) lines[ts] = lines[ts] "\n" $0
            else lines[ts] = $0
          }
    
    END   { # output in chronological order
            for( l in lines ) print lines[ l ]
          }
    

    像这样使用它:awk -f conv_date.awk your_file

    【讨论】:

    • 当您有两个具有相同日期和时间戳的文件时会发生什么?
    • @jaypalsingh 感谢您的提示,我为这种情况添加了支票。
    【解决方案4】:

    保存脚本

    #!/bin/bash
    
    reorder()
    {
    awk '{printf "%s %s %s %s\n",$2,$3,$1,$4}' $1 \
    | sort -t'-' -k2 -M \
    | awk '{printf "%s %s %s %s\n",$3,$1,$2,$4}' #You can omit this pipe
    }
    
    reorder $1
    

    作为 sortcontent.sh 并运行它

    ./sortcontent.sh your_file_name
    

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 2021-09-07
      • 2010-09-26
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多