2016-04-24 9 views
3

Ich habe eine Datei mit dem nächsten Inhalt:Wie kann ich den Inhalt einer Datei nach Datum sortieren?

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 

und ich möchte diese Inhalte durch ihre Daten gefiltert bekommen, aber im nicht sicher, wie ich das tun kann, ich habe bisher nur den folgenden Code konvertiert die Daten für einen comparation aber im nicht sicher, wie es um in der bash-Code zu verwenden, um die Datei zu filtern:

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

hast du diese http://stackoverflow.com/questions/3193720/unix-sorting-with-primary-and-secondary-keys –

+1

nicht sicher, wie Sie Ihre Datei generieren. Wenn es mit 'ls' ist, gibt es Optionen, um es nach Datum zu sortieren - siehe 'man ls'. Übrigens. Filterung reduziert Linien, Sortieren von Sortierungen. Ihre Frage klingt wie Sortieren statt Filter ... – jerik

Antwort

1

Wenn Sie sind komfortabel mit GNU AWK, dann ein Skript wie das funktionieren würde:

konv _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 ] 
     } 

es wie folgt verwendet: awk -f conv_date.awk your_file

+0

Was passiert, wenn Sie zwei Dateien mit demselben Datum und demselben Zeitstempel haben? –

+0

@jaypalsingh Danke für den Hinweis, ich habe einen Scheck für diesen Fall hinzugefügt. –

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- 

Ausgang:

 
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

Nizza. Aber "24: 11" Annahme ist ein bisschen gefährlich, ist es nicht – sjsam

+1

okay, um es robuster zu machen: '[[$ line = ~ [^" "] *" "* ([^" "] *)" "[^" "] *" "[^" "] *]]; d = $ (Datum -d "$ {BASH_REMATCH [1]}" + "% Y% m% d") '. Ich nehme an, er benutzte keine Tabs. – Cyrus

0

Speichern Sie das Skript

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

als sortcontent.sh und führen Sie es wie

./sortcontent.sh your_file_name 
2

Wenn offen perl dann Schwartzian Transformation am besten in Umsetzung. Dies verwendet ein Core-Modul, so dass keine Installation von CPAN erforderlich ist.

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 
Verwandte Themen