AMG: unsort is a simple UNIXy stdin->stdout pipeline tool for randomizing line order. It's simple, works quite nicely, and is surprisingly useful.
Without further ado, I present to you the source:
#!/bin/sh # \ exec tclsh "$0" "$@" proc main {} { set lines [list] foreach line [lrange [split [read stdin] \n] 0 end-1] { lappend lines [list [expr {rand()}] $line] } foreach line [lsort -real -index 0 $lines] { puts [lindex $line 1] } } main # vim: set ts=4 sts=4 sw=4 tw=80 et ft=tcl:
Even though the above really is good enough, I'm still interested in seeing performance improvements. Any ideas?
Let's give it a try, shall we?
[andy@blender|~/devel/misc]$ unsort <<EOF > alpha > bravo > charlie > delta > EOF charlie bravo delta alpha
I usually use unsort for creating a randomized playlist:
[andy@blender|~]$ mplayer $(find ~/media/music -type f | unsort)
Works great! I'm using it right now, as a matter of fact.
See also Shuffling a list
Under which category or categories should this page be filed?
Ideas: [ [Category Sorting] | [Category UNIX] | [Category Command Line Tools] | [Category Text Processing] | [Category Entropy Source] :^) ]