Using a form of decorate-sort-undecorate pattern and awk
you can do something like:
$ seq 10 | awk 'BEGIN{srand();} {printf "%06d %s
", rand()*1000000, $0;}' | sort -n | cut -c8-
8
5
1
9
6
3
7
2
10
4
For a file, you would do:
$ awk 'BEGIN{srand();} {printf "%06d %s
", rand()*1000000, $0;}' SORTED.TXT | sort -n | cut -c8- > SHUFFLED.TXT
or cat
the file at the start of the pipeline.
This works by generating a column of random numbers between 000000
and 999999
inclusive (decorate); sorting on that column (sort); then deleting the column (undecorate). That should work on platforms where sort does not understand numerics by generating a column with leading zeros for lexicographic sorting.
You can increase that randomization, if desired, in several ways:
If your platform's sort
understands numerical values (POSIX, GNU and BSD do) you can do awk 'BEGIN{srand();} {printf "%0.15f%s
", rand(), $0;}' FILE.TXT | sort -n | cut -f 2-
to use a near double float for random representation.
If you are limited to a lexicographic sort, just combine two calls to rand
into one column like so: awk 'BEGIN{srand();} {printf "%06d%06d%s
", rand()*1000000,rand()*1000000, $0;}' FILE.TXT | sort -n | cut -f 2-
which gives a composite 12 digits of randomization.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…