Cred că va trebui să luați în considerare anii de salt. Nu am făcut matematica, dar cred că, în timpul unui an bisect, cu un cod dur de 28 de zile pentru feb, o comparație de amiază pe 2/29 și la prânz pe 3/1 ar avea ca rezultat aceeași dublă timbră de timp ca înainte . Deși se pare că nu l-ai implementat așa. Pe modul în care l-ați implementat, cred că aveți în continuare problema, dar este între datele de pe 12/31 din $ leapyear și 1/1 din $ leapyear + 1.
Cred că ați putea avea și unele coliziuni în timpul schimbărilor de timp dacă codul dvs. trebuie să se ocupe de fusurile orare care le manipulează.
Fișierul nu pare a fi sortat într-un mod util. Cred că acel câmp $ 1 este un fel de statut ("OK" pe care îl verificați). Deci, este sortat după statutul de înregistrare, apoi pe DAY, apoi pe LUNĂ, ANUL, ORE, MINUTE, SECUNDARE. Dacă ar fi fost anul, luna, ziua, cred că ar putea exista unele optimizări acolo. Încă ar putea fi, dar creierul meu merge într-o direcție diferită chiar acum.
Dacă există un număr mic de chei duplicate proporțional cu numărul total de linii, cred că cel mai bun pariu este să reduceți fișierul pe care funcționează scriptul dvs. awk pentru a duplica cheile (ca David a spus ). Ați putea, de asemenea, să preprocesați fișierul astfel încât singurele linii prezente să fie linia / OK /. Cred că aș face acest lucru cu o conductă în care primul script awk imprimă numai liniile cu ID-uri duplicate, iar al doilea script awk este în esență cel de mai sus dar optimizat pentru a nu căuta / OK / și cu cunoștința că orice prezent cheie este cheia duplicat.
Dacă știți înaintea timpului că toate sau majoritatea liniilor vor avea chei repetate, probabil că nu merită. Aș mușca glonțul și îl scriu în C. Tons mai multe linii de cod, mult mai repede decât scriptul awk.