如何按日期对文件内容进行排序?

时间:2016-04-24 17:48:39

标签: linux bash ubuntu terminal

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

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"

4 个答案:

答案 0 :(得分:2)

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        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.4.7.tar.gz      12-Apr-2016 16:13  127M
linux-4.5.1.tar.gz      12-Apr-2016 16:08  128M
linux-4.4.8.tar.gz      20-Apr-2016 07:00  127M
linux-4.5.2.tar.gz      20-Apr-2016 07:00  128M

答案 1 :(得分:2)

如果对perl开放,则最好在其中实施Schwartzian变换。这使用核心模块,因此无需从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

答案 2 :(得分:1)

如果你习惯使用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

答案 3 :(得分:0)

保存脚本

#!/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

as sortcontent.sh并像

一样运行
./sortcontent.sh your_file_name