Hi, On 12-Oct-01 Ted Harding wrote:
If you want a quick one-off one-liner, the following does it nicely:
Suppose your file, with a separate original number in each line, is called "temp". Then:
cat temp | awk 'BEGIN{srand()} {$2=$1; $1=rand(); print $0}' | sort -n | awk '{print $2}'
will do it. This basically outputs the original lines in a random order. (In fact, they don't need to be numbers thnough, as written, the above will fail if they are text lines with spaces since the default field separator in awk is the space; however, if needed, this can be worked round by changing awk's internal FS and OFS variables in the "awk" invocations).
Following the above, I've extended the method along the lines
suggested. The following two scripts will:
(a) output the input file with the lines rearranged in random order,
whether these lines are numbers or text;
(b) make a random selection of a given number out of the lines
in the file.
Copy the scripts into the named files and make them executable
(chmod 755).
(a) rand_perm_lines
#! /bin/bash
cat $1 |
awk 'BEGIN{FS=SUBSEP; OFS=SUBSEP; srand()} \
{$2=$1; $1=rand(); print $0}' |
sort -n |
awk 'BEGIN{FS=SUBSEP;OFS=" "}{print $2}'
(b) rand_select_lines
#! /bin/bash
cat $1 |
awk 'BEGIN{FS=SUBSEP; OFS=SUBSEP; srand()} \
{$2=$1; $1=rand(); print $0}' |
sort -n |
awk 'BEGIN{FS=SUBSEP;OFS=" "}{print $2}' |
head -n $2
(note that (b) is simply (a) with a bit tagged on).
Usage:
(a) rand_perm_lines filename
(b) rand_select_lines filename N
(where N is the number of lines you want to select).
Ted.
--------------------------------------------------------------------
E-Mail: (Ted Harding)