我想随机洗牌文本文件的行,并创建一个新文件。该文件可能有几千行。
我如何用cat, awk, cut等做到这一点?
我想随机洗牌文本文件的行,并创建一个新文件。该文件可能有几千行。
我如何用cat, awk, cut等做到这一点?
当前回答
在windows下,您可以尝试此批处理文件来帮助您洗牌data.txt,批处理代码的用法是
C:\> type list.txt | shuffle.bat > maclist_temp.txt
发出这个命令后,maclist_temp.txt将包含一个随机的行列表。
希望这能有所帮助。
其他回答
在windows下,您可以尝试此批处理文件来帮助您洗牌data.txt,批处理代码的用法是
C:\> type list.txt | shuffle.bat > maclist_temp.txt
发出这个命令后,maclist_temp.txt将包含一个随机的行列表。
希望这能有所帮助。
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个)元素。
这个bash函数有最小的依赖关系(只有sort和bash):
shuf() {
while read -r x;do
echo $RANDOM$'\x1f'$x
done | sort |
while IFS=$'\x1f' read -r x y;do
echo $y
done
}
基于scai的答案的Python一行,但是a)接受stdin, b)使结果与seed可重复,c)只选出所有行的200行。
$ cat file | python -c "import random, sys;
random.seed(100); print ''.join(random.sample(sys.stdin.readlines(), 200))," \
> 200lines.txt
简单的基于awk的函数将完成这项工作:
shuffle() {
awk 'BEGIN{srand();} {printf "%06d %s\n", rand()*1000000, $0;}' | sort -n | cut -c8-
}
用法:
any_command | shuffle
这应该可以在几乎任何UNIX上工作。在Linux、Solaris和HP-UX上测试。
更新:
注意,前导零(%06d)和rand()乘法使它在sort不理解数字的系统上也能正常工作。它可以通过字典顺序(也就是普通字符串比较)进行排序。