如何使用 Red Hat Linux 上的标准工具随机化文件中的行?
如何使用 Red Hat Linux 上的标准工具随机化文件中的行?
我没有 shuf
命令,因此我正在寻找类似 perl
或 awk
单行命令来完成相同的任务。
How can I randomize the lines in a file using standard tools on Red Hat Linux?
I don't have the shuf
command, so I am looking for something like a perl
or awk
one-liner that accomplishes the same task.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
嗯,我们不要忘记
Um, lets not forget
shuf
是最好的方法。sort -R
非常慢。 我只是尝试对 5GB 文件进行排序。 2.5小时后我放弃了。 然后shuf
一分钟之内就把它排序了。shuf
is the best way.sort -R
is painfully slow. I just tried to sort 5GB file. I gave up after 2.5 hours. Thenshuf
sorted it in a minute.你就得到了一个 Perl 语句!
它使用一个模块,但该模块是 Perl 代码分发的一部分。 如果这还不够好,您可以考虑自己推出。
我尝试将其与
-i
标志(“就地编辑”)一起使用来编辑文件。 文档表明它应该有效,但事实并非如此。 它仍然将打乱的文件显示到标准输出,但这次它删除了原始文件。 我建议你不要使用它。考虑一个 shell 脚本:
未经测试,但希望可以工作。
And a Perl one-liner you get!
It uses a module, but the module is part of the Perl code distribution. If that's not good enough, you may consider rolling your own.
I tried using this with the
-i
flag ("edit-in-place") to have it edit the file. The documentation suggests it should work, but it doesn't. It still displays the shuffled file to stdout, but this time it deletes the original. I suggest you don't use it.Consider a shell script:
Untested, but hopefully works.
读取文件,在每一行前面添加一个随机数,根据这些随机前缀对文件进行排序,然后剪切前缀。 单衬管适用于任何半现代外壳。
编辑:合并理查德·汉森的言论。
Read the file, prepend every line with a random number, sort the file on those random prefixes, cut the prefixes afterwards. One-liner which should work in any semi-modern shell.
EDIT: incorporated Richard Hansen's remarks.
python 的单行:
并且仅打印单个随机行:
但是请参阅 这篇文章 了解 python < 的缺点代码>random.shuffle()。 它不适用于许多(超过 2080 个)元素。
A one-liner for python:
And for printing just a single random line:
But see this post for the drawbacks of python's
random.shuffle()
. It won't work well with many (more than 2080) elements.与 Jim 的回答相关:
我的
~/.bashrc
包含以下内容:使用 GNU coreutils 的排序,
-R
=--random-sort
,其中生成每行的随机散列并按其排序。 随机哈希实际上不会在某些较旧(有问题)版本的某些区域设置中使用,导致它返回正常的排序输出,这就是我设置 LC_ALL=C 的原因。与克里斯的回答相关:
是一句稍短的俏皮话。 (
-Mmodule=a,b,c
是-e 'use module qw(abc);'
的简写。)给出一个简单的
-i 的原因
不适用于就地洗牌,因为 Perl 期望print
发生在正在读取文件的同一循环中,并且print shuffle <> 在读取并关闭所有输入文件后才会输出。
作为更短的解决方法,
将就地洗牌文件。 (
-n
表示“将代码包装在while (<>) {...}
循环中;BEGIN{undef$/}
使 Perl 对一次文件而不是一次行进行操作,并且需要split/^/m
因为$_=<>
code> 已隐式完成整个文件而不是行。)Related to Jim's answer:
My
~/.bashrc
contains the following:With GNU coreutils's sort,
-R
=--random-sort
, which generates a random hash of each line and sorts by it. The randomized hash wouldn't actually be used in some locales in some older (buggy) versions, causing it to return normal sorted output, which is why I setLC_ALL=C
.Related to Chris's answer:
is a slightly shorter one-liner. (
-Mmodule=a,b,c
is shorthand for-e 'use module qw(a b c);'
.)The reason giving it a simple
-i
doesn't work for shuffling in-place is because Perl expects that theprint
happens in the same loop the file is being read, andprint shuffle <>
doesn't output until after all input files have been read and closed.As a shorter workaround,
will shuffle files in-place. (
-n
means "wrap the code in awhile (<>) {...}
loop;BEGIN{undef$/}
makes Perl operate on files-at-a-time instead of lines-at-a-time, andsplit/^/m
is needed because$_=<>
has been implicitly done with an entire file instead of lines.)当我使用自制软件安装 coreutils 时,
shuf
变为n
。When I install coreutils with homebrew
shuf
becomes available asn
.带有 DarwinPorts 的 Mac OS X:
Mac OS X with DarwinPorts:
FreeBSD 有自己的随机实用程序:
它位于 /usr/games/random 中,因此如果您还没有安装游戏,那么您就不走运了。
您可以考虑安装 textproc/rand 或 textproc/msort 等端口。 如果考虑可移植性,这些很可能在 Linux 和/或 Mac OS X 上可用。
FreeBSD has its own random utility:
It's in /usr/games/random, so if you have not installed games, you are out of luck.
You could consider installing ports like textproc/rand or textproc/msort. These might well be available on Linux and/or Mac OS X, if portability is a concern.
在 OSX 上,从 http://ftp.gnu.org/gnu/coreutils/ 获取最新版本和类似
./configure 的东西
制作
sudo make install
...应该给你 /usr/local/bin/sort --random-sort
而不会弄乱 /usr/bin/sort
On OSX, grabbing latest from http://ftp.gnu.org/gnu/coreutils/ and something like
./configure
make
sudo make install
...should give you /usr/local/bin/sort --random-sort
without messing up /usr/bin/sort
或者从 MacPorts 获取:
和/或
Or get it from MacPorts:
and/or