如何使用 Red Hat Linux 上的标准工具随机化文件中的行?

发布于 2024-07-20 07:43:48 字数 137 浏览 10 评论 0原文

如何使用 Red Hat Linux 上的标准工具随机化文件中的行?

我没有 shuf 命令,因此我正在寻找类似 perlawk 单行命令来完成相同的任务。

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

疯狂的代价 2024-07-27 07:43:48

嗯,我们不要忘记

sort --random-sort

Um, lets not forget

sort --random-sort
弄潮 2024-07-27 07:43:48

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. Then shuf sorted it in a minute.

满地尘埃落定 2024-07-27 07:43:48

你就得到了一个 Perl 语句!

perl -MList::Util -e 'print List::Util::shuffle <>'

它使用一个模块,但该模块是 Perl 代码分发的一部分。 如果这还不够好,您可以考虑自己推出。

我尝试将其与 -i 标志(“就地编辑”)一起使用来编辑文件。 文档表明它应该有效,但事实并非如此。 它仍然将打乱的文件显示到标准输出,但这次它删除了原始文件。 我建议你不要使用它。

考虑一个 shell 脚本:

#!/bin/sh

if [[ $# -eq 0 ]]
then
  echo "Usage: $0 [file ...]"
  exit 1
fi

for i in "$@"
do
  perl -MList::Util -e 'print List::Util::shuffle <>' $i > $i.new
  if [[ `wc -c $i` -eq `wc -c $i.new` ]]
  then
    mv $i.new $i
  else
    echo "Error for file $i!"
  fi
done

未经测试,但希望可以工作。

And a Perl one-liner you get!

perl -MList::Util -e 'print List::Util::shuffle <>'

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:

#!/bin/sh

if [[ $# -eq 0 ]]
then
  echo "Usage: $0 [file ...]"
  exit 1
fi

for i in "$@"
do
  perl -MList::Util -e 'print List::Util::shuffle <>' $i > $i.new
  if [[ `wc -c $i` -eq `wc -c $i.new` ]]
  then
    mv $i.new $i
  else
    echo "Error for file $i!"
  fi
done

Untested, but hopefully works.

谁把谁当真 2024-07-27 07:43:48
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

读取文件,在每一行前面添加一个随机数,根据这些随机前缀对文件进行排序,然后剪切前缀。 单衬管适用于任何半现代外壳。

编辑:合并理查德·汉森的言论。

cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-

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.

白首有我共你 2024-07-27 07:43:48

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 个)元素。

A one-liner for python:

python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile

And for printing just a single random line:

python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile

But see this post for the drawbacks of python's random.shuffle(). It won't work well with many (more than 2080) elements.

情话难免假 2024-07-27 07:43:48

与 Jim 的回答相关:

我的 ~/.bashrc 包含以下内容:

unsort ()
{
    LC_ALL=C sort -R "$@"
}

使用 GNU coreutils 的排序,-R = --random-sort,其中生成每行的随机散列并按其排序。 随机哈希实际上不会在某些较旧(有问题)版本的某些区域设置中使用,导致它返回正常的排序输出,这就是我设置 LC_ALL=C 的原因。


与克里斯的回答相关:

perl -MList::Util=shuffle -e'print shuffle<>'

是一句稍短的俏皮话。 (-Mmodule=a,b,c-e 'use module qw(abc);' 的简写。)

给出一个简单的 -i 的原因 不适用于就地洗牌,因为 Perl 期望 print 发生在正在读取文件的同一循环中,并且 print shuffle <> 在读取并关闭所有输入文件后才会输出。

作为更短的解决方法,

perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'

将就地洗牌文件。 (-n 表示“将代码包装在 while (<>) {...} 循环中;BEGIN{undef$/} 使 Perl 对一次文件而不是一次行进行操作,并且需要 split/^/m 因为 $_=<> code> 已隐式完成整个文件而不是行。)

Related to Jim's answer:

My ~/.bashrc contains the following:

unsort ()
{
    LC_ALL=C sort -R "$@"
}

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 set LC_ALL=C.


Related to Chris's answer:

perl -MList::Util=shuffle -e'print shuffle<>'

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 the print happens in the same loop the file is being read, and print shuffle <> doesn't output until after all input files have been read and closed.

As a shorter workaround,

perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'

will shuffle files in-place. (-n means "wrap the code in a while (<>) {...} loop; BEGIN{undef$/} makes Perl operate on files-at-a-time instead of lines-at-a-time, and split/^/m is needed because $_=<> has been implicitly done with an entire file instead of lines.)

岁吢 2024-07-27 07:43:48

当我使用自制软件安装 coreutils 时,

brew install coreutils

shuf 变为 n

When I install coreutils with homebrew

brew install coreutils

shuf becomes available as n.

挽你眉间 2024-07-27 07:43:48

带有 DarwinPorts 的 Mac OS X:

sudo port install unsort
cat $file | unsort | ...

Mac OS X with DarwinPorts:

sudo port install unsort
cat $file | unsort | ...
不再让梦枯萎 2024-07-27 07:43:48

FreeBSD 有自己的随机实用程序:

cat $file | random | ...

它位于 /usr/games/random 中,因此如果您还没有安装游戏,那么您就不走运了。

您可以考虑安装 textproc/rand 或 textproc/msort 等端口。 如果考虑可移植性,这些很可能在 Linux 和/或 Mac OS X 上可用。

FreeBSD has its own random utility:

cat $file | random | ...

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.

森林很绿却致人迷途 2024-07-27 07:43:48

在 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

没有你我更好 2024-07-27 07:43:48

或者从 MacPorts 获取:

$ sudo port install coreutils

和/或

$ /opt/local//libexec/gnubin/sort --random-sort

Or get it from MacPorts:

$ sudo port install coreutils

and/or

$ /opt/local//libexec/gnubin/sort --random-sort
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文