In meiner Welt hat man Scripte oder Perfomanceprobleme, selten beides
Aber da gab's doch noch nen paar Tools, die sich vielleicht mit ganz viel Überredungskunst für solchen Unfug missbrauchen lassen.
Grundsätzlich, was bräuchte man denn, um das Problem lösen zu können?
Entweder zweimal einlesen (was hier wirklich der einfachste Fall wäre) oder die Sachen die auf das Script zukommen mal kurz wegspeichern.
Und dafür würde sich dann ja tee aufdrängen. Also Idee von vorher, erweitert um tee.
Ansatz zwei... hmm. Vielleicht hab ich Tomaten auf den Augen, oder es ist einfach schon spät (oder noch nicht spät genug) und ich seh es grade nicht, aber vermutlich gibts noch ne elegante Lösung via namedpipes und/oder ausreichend große Puffer. Muss ich mal nen Weilchen drüber nachdenken, wie man die Gleichzeitigkeit aufgelöst bekäme, die Aufgabenstellung ist jedenfalls interessant.
Inkrementell aussortieren geht jedenfalls zeilenweise auf den ersten Blick erstmal nicht, jedenfalls wäre dann die Gleichverteilung beim Zufall futsch.
Wäre das egal, hätt ich gesagt, wir bauen einfach n Buckets, und schubsen die Ergebnisse darein oder eben auch nicht. Und am Ende nimmt man was in den Eimern liegt als Ausgabe.
Problem dabei ist nur, am Ende sind die letzten n Werte mit ner jeweiligen Wahrscheinlichkeit von 0.5 ausgewählt, die ersten paar Werte hingegen ziemlich sicher nicht vertreten, hübscher Zufall ist anders.
Man müsste also ne Gewichtung an den Wert anbringen, die pro Durchlauf, d.h. nach n Zeilen, den Faktor immer weiter in immer größeren Schritten absenkt.
Kann man machen, wenn man die Formel richtig wählt, statistisch vermutlich sogar ok, aber trotzdem hässlich.
(Ok, es ist zu spät. Ich krieg das grad nicht ordentlich zu Ende gedacht, w_n+1=w_n/2 ?)
Vermutlich gibts bessere Wege ... und vermutlich steht das auch alles viel klüger auf der Wikipedia Seite, die Du verlinkt hast
(ich les das morgen mal in Ruhe, heute bleibt eh nix mehr hängen)
Nen netter Ansatz, den ich vorhin beim Spicken in der Infopage gefunden hatte, sollte sich auch relativ einfach umsetzen lassen.
"info coreutils sort invocation" sagt:
‘-R’
‘--random-sort’
‘--sort=random’
Sort by hashing the input keys and then sorting the hash values.
Choose the hash function at random, ensuring that it is free of
collisions so that differing keys have differing hash values. This
is like a random permutation of the inputs (*note shuf
invocation::), except that keys with the same value sort together.
If multiple random sort fields are specified, the same random hash
function is used for all fields. To use different random hash
functions for different fields, you can invoke ‘sort’ more than
once.
The choice of hash function is affected by the ‘--random-source’
option.
Im Grunde auch nicht viel anders als Deine Idee, nur eben reproduzierbar.
Dann bleibt nun nur die Frage, Posix gefällige Hashfunktion? Gibts da was schönes? md5 ist von '91, das dürfte zu Deiner Sun passen, sonst eben md4, das ist zwar nur unwesentlich älter (Wikipedia meint '90) könnt aber die zusätzlich nötigen paar Wochen (Monate? Jahre?) bringen
Und um wieder zu den pragmatischen Vorschlägen zurückzukommen:
vipe wäre auch noch ne (absurde und nicht regelkonforme) Idee: Input einfach nach vim schubsen und das Problem da lösen lassen