2016-09-12 5 views
1

Ich habe eine Liste, wo erste 6 Ziffer ist Datum im Format JJJJMMTT. Die nächsten 4 Ziffern sind Teil des Zeitstempels. Ich möchte nur die Nummern auswählen, die für jeden Tag den maximalen Zeitstempel haben.Finden von Maximum aus Teilstring

20160905092900 
20160905212900 
20160906092900 
20160906213000 
20160907093000 
20160907213000 
20160908093000 
20160908213000 
20160910093000 
20160910213100 
20160911093100 
20160911213100 
20160912093100 

Mittel aus der obigen Liste sollte die Ausgabe die folgende Liste geben.

20160905212900 
20160906213000 
20160907213000 
20160908213000 
20160910213100 
20160911213100 
20160912093100 
+0

Angenommen, die Eingabe ist immer in zunehmender Zeit Reihenfolge, was Sie wollen, ist der Datensatz kurz vor jeder Änderung in den ersten 8 Zeichen (der Tag), oder? Verwenden Sie Teilstr. –

Antwort

0

können Sie awk verwenden:

awk '{ 
    dt = substr($0, 1, 8) 
    ts = substr($0, 9, 12) 
} 
ts > max[dt] { 
    max[dt] = ts 
    rec[dt] = $0 
} 
END { 
    for (i in rec) 
     print rec[i] 
}' file  

20160905212900 
20160906213000 
20160907213000 
20160908213000 
20160910213100 
20160911213100 
20160912093100 

Wir assoziatives Array max verwenden, die ersten 8 Zeichen als Schlüssel und nächsten 4 Zeichen als Wert verwendet. Dieses Array wird verwendet, um den maximalen Zeitstempelwert für ein bestimmtes Datum zu speichern. Ein weiteres Array rec wird verwendet, um die vollständige Zeile für ein Datum zu speichern, wenn der Zeitstempelwert größer als der gespeicherte Wert im Array max ist.

1
$ sort -r file | awk '!seen[substr($0,1,8)]++' | sort 
20160905212900 
20160906213000 
20160907213000 
20160908213000 
20160910213100 
20160911213100 
20160912093100 

Wenn die Datei bereits sortiert die Sie tac statt sort verwenden können.