diff options
Diffstat (limited to 'bin/rndl.mi5')
-rw-r--r-- | bin/rndl.mi5 | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/bin/rndl.mi5 b/bin/rndl.mi5 new file mode 100644 index 00000000..f99ccbea --- /dev/null +++ b/bin/rndl.mi5 @@ -0,0 +1,38 @@ +# Print a random line from input +self=rndl + +# If there are no arguments, we're checking stdin; this is more complicated +# than checking file arguments because we have to count the lines in order to +# correctly choose a random one, and two passes means we require a temporary +# file if we don't want to read all of the input into memory (!) +if [ "$#" -eq 0 ] ; then + +<% +include(`include/mktd.m4') +%> + + # We'll operate on stdin in the temp directory; write the script's stdin to + # it with cat(1) + set -- "$td"/stdin + cat >"$td"/stdin +fi + +# Count the number of lines in the input +lc=$(sed -- '$=;d' "$@") || exit + +# If there were none, bail +case $lc in + ''|0) + printf >&2 'rndl: No lines found on input\n' + exit 2 + ;; +esac + +# Try to get a random seed from rnds(1df) for rndi(1df) +seed=$(rnds) + +# Get a random line number from rndi(1df) +ri=$(rndi 1 "$lc" "$seed") || exit + +# Print the line using sed(1) +sed -- "$ri"'!d' "$@" |