打乱文本的行

今天cbl问了我一个问题: 怎样打乱一个文本文件的所有行??

仔细一想, 确实有难度... 因为那个文本文件居然有1G, 用python读进内存再打乱的思路估计不行啊... 那么awk, shell什么的有没有解决方法? 搜到了一些帖子, 但是稍微复杂一点的shell脚本我也看不懂(弱爆了)...

我甚至想大概vim会提供这个功能吧, 没想到在搜的时候居然搜到了一个现成的shell命令: shuf!!

$ shuf --help
用法: shuf [选项]... [文件]
 或者:  shuf -e [选项]... [参数]...
 或者:  shuf -i LO-HI [选项]...
把输入行按随机顺序输出到标准输出。

长选项必须使用的参数对于短选项时也是必需使用的。
  -e, --echo            将每个参数视为输入行
  -i, --input-range=LO-HI   将LO 到HI 的每个数字视为输入行
  -n, --head-count=行数       最多输出指定的行数
  -o, --output=文件       将结果输出到指定文件而非标准输出
      --random-source=文件    从指定文件获得随机比特
  -z, --zero-terminated 以0 结束行而非新行
      --help        显示此帮助信息并退出
      --version     显示版本信息并退出

如果没有指定文件,或者文件为"-",则从标准输入读取。

[请向bug-coreutils@gnu.org](mailto:请向bug-coreutils@gnu.org) 报告shuf 的错误
GNU coreutils 项目主页:<<http://www.gnu.org/software/coreutils/>>
GNU 软件一般性帮助:<<http://www.gnu.org/gethelp/>>
请向<<http://translationproject.org/team/zh_CN.html>> 报告shuf 的翻译错误

太好了吧! 用一个小的文本文件一试, 果然是可以的! shuf [filename] 另外, 加上-o参数, 可以指定输出到一个新文件(估计用shell的输出重定向方法也可以吧): shuf [filename] -o [output_filename]

对了, 我搜到的网址是这里, 介绍了一些非主流的命令. 比如另一条命令: tac(cat的反转), 作用是先输出文件的末端, 也很有意思.

comments powered by Disqus