2016-04-24 2 views
3

У меня есть файл со следующим содержанием:как я могу сортировать содержимое файла по дате?

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 

и я хотел бы получить этот контент отфильтрованного по датам, но им не уверен, как я могу это сделать, до сих пор у меня есть только следующий код конвертировать даты для Comparation, но им не уверен, как использовать его в Баше кода для того, чтобы отфильтровать файл:

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

вы увидели это http://stackoverflow.com/questions/3193720/unix-sorting-with-primary-and-secondary-keys –

+1

Не знаю, как вы создаете свой файл. Если у него есть «ls», есть варианты сортировки по дате - см. «Man ls». Btw. фильтрация уменьшает количество строк, сортирует сортировки. Ваш вопрос звучит как сортировка вместо фильтра ... – jerik

ответ

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

+0

Что происходит, когда у вас есть два файла с одинаковой датой и меткой времени? –

+0

@jaypalsingh Спасибо за подсказку, я добавил чек на этот случай. –

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 
+0

Ницца. Но предположение '24: 11 'немного опасно, не так ли? – sjsam

+1

хорошо, чтобы сделать его более надежным:' [[$ line = ~ [^ ""] * "" * ([^ ""] *) " "[^" "] *" "[^" "] *]]; d = $ (date -d "$ {BASH_REMATCH [1]}" + "% Y% m% d") '. Я полагаю, он не использовал никаких вкладок. – Cyrus

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 

, как sortcontent.sh и запустить его как

./sortcontent.sh your_file_name 
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 
Смежные вопросы