我想随机洗牌文本文件的行,并创建一个新文件。该文件可能有几千行。
我如何用cat, awk, cut等做到这一点?
我想随机洗牌文本文件的行,并创建一个新文件。该文件可能有几千行。
我如何用cat, awk, cut等做到这一点?
当前回答
这是第一次尝试,对编码器来说很容易,但对CPU来说很难,它在每行前加上一个随机数,对它们进行排序,然后从每行中剥离随机数。实际上,这些行是随机排序的:
cat myfile | awk 'BEGIN{srand();}{print rand()"\t"$0}' | sort -k1 -n | cut -f2- > myfile.shuffled
其他回答
这是第一次尝试,对编码器来说很容易,但对CPU来说很难,它在每行前加上一个随机数,对它们进行排序,然后从每行中剥离随机数。实际上,这些行是随机排序的:
cat myfile | awk 'BEGIN{srand();}{print rand()"\t"$0}' | sort -k1 -n | cut -f2- > myfile.shuffled
你可以使用洗牌。至少在某些系统上(似乎不在POSIX中)。
正如jleedev指出的:sort -R可能也是一个选项。至少在某些系统上;好吧,你懂的。已经指出sort -R并不真正洗牌,而是根据项的哈希值进行排序。
[编者注:sort -R几乎是洗牌,除了重复的行/排序键总是彼此挨着。换句话说:只有唯一的输入行/键才是真正的shuffle。虽然输出顺序确实是由哈希值决定的,但随机性来自于选择随机哈希函数-参见手册。
python的一行代码:
python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile
如果只打印单个随机行:
python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile
但是请参阅这篇文章了解python的random.shuffle()的缺点。它不能很好地处理很多(超过2080个)元素。
尚未被提及:
unsort的util。语法(有点面向播放列表): unsort [-hvrpncmMsz0l][——help][——version][——random][——heuristic] [——identity][——filenames[=profile]][——separator sep][——concatenate] [——合并][——merge-random][——种子整数][——字符串作为][——零] [——linefeed][文件…] Msort可以逐行洗牌,但它通常是多余的: Seq 10 | msort -jq -b -l -n 1 -c r
一种简单而直观的方法是使用shuf。
例子:
假设words.txt为:
the
an
linux
ubuntu
life
good
breeze
要洗牌,请执行以下操作:
$ shuf words.txt
这将把打乱的行扔到标准输出;所以,你必须将它管道到一个输出文件,就像:
$ shuf words.txt > shuffled_words.txt
一次这样的洗牌可能会产生:
breeze
the
linux
an
ubuntu
good
life