如果jot
在您的系统上,那么我猜您正在运行 FreeBSD 或 OSX 而不是 Linux,因此您可能没有类似rl
或sort -R
可用的工具。
不用担心。我不得不在不久前这样做。试试这个:
$ printf 'one\ntwo\nthree\nfour\nfive\n' > input.txt
$ cat rndlines
#!/bin/sh
# default to 3 lines of output
lines="${1:-3}"
# default to "input.txt" as input file
input="${2:-input.txt}"
# First, put a random number at the beginning of each line.
while read line; do
printf '%8d%s\n' $(jot -r 1 1 99999999) "$line"
done < "$input" |
sort -n | # Next, sort by the random number.
sed 's/^.\{8\}//' | # Last, remove the number from the start of each line.
head -n "$lines" # Show our output
$ ./rndlines input.txt
two
one
five
$ ./rndlines input.txt
four
two
three
$
这是一个 1 行示例,它还使用 awk 更干净地插入了随机数:
$ printf 'one\ntwo\nthree\nfour\nfive\n' | awk 'BEGIN{srand()} {printf("%8d%s\n", rand()*10000000, $0)}' | sort -n | head -n 3 | cut -c9-
请注意,不同版本的sed
(在 FreeBSD 和 OSX 中)可能需要-E
选项而不是-r
处理 ERE,或者如果您想明确使用正则表达式中的 BRE 方言,尽管我测试的所有内容都适用于 BRE 中的转义边界。((HP/UX 等)的古代版本sed
可能不支持这种表示法,但只有在您已经知道如何做到这一点时才会使用这些表示法。)