簡體   English   中英

如何使用Red Hat Linux上的標准工具隨機化文件中的行?

[英]How can I randomize the lines in a file using standard tools on Red Hat Linux?

如何使用Red Hat Linux上的標准工具隨機化文件中的行?

我沒有shuf命令,所以我正在尋找像perlawk one-liner這樣的東西來完成同樣的任務。

嗯,別忘了

sort --random-sort

shuf是最好的方式。

sort -R非常緩慢。 我只是嘗試排序5GB文件。 我放棄了2.5小時后。 然后shuf在一分鍾內對它進行了分類。

你得到一個Perl單線程!

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

它使用模塊,但該模塊是Perl代碼分發的一部分。 如果這還不夠好,你可以考慮自己動手。

我嘗試使用-i標志(“編輯就地”)來編輯文件。 文檔表明它應該有效,但事實並非如此。 它仍然將混洗文件顯示到stdout,但這次它會刪除原始文件。 我建議你不要用它。

考慮一個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

未經測試,但希望有效。

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

讀取文件,在每行前面加一個隨機數,在這些隨機前綴上對文件進行排序,然后剪切前綴。 單襯里應該適用於任何半現代的外殼。

編輯:納入理查德漢森的言論。

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

與Jim的回答有關:

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

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

使用GNU coreutils的排序, -R = --random-sort ,它生成每行的隨機散列並按其排序。 隨機散列實際上不會在某些較舊(錯誤)版本的某些語言環境中使用,導致它返回正常的排序輸出,這就是我設置LC_ALL=C


與Chris的回答有關:

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 ,因為$_=<>已隱式使用整個文件而不是行。)

當我用自制軟件安裝coreutils時

brew install coreutils

shuf成為n

帶有DarwinPorts的Mac OS X:

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

FreeBSD有自己的隨機工具:

cat $file | random | ...

它在/ usr / games / random中,所以如果你還沒有安裝游戲,那你就不走運了。

您可以考慮安裝textproc / rand或textproc / msort等端口。 如果可移植性是一個問題,這些可能在Linux和/或Mac OS X上可用。

在OSX上,從http://ftp.gnu.org/gnu/coreutils/獲取最新信息

./configure make sudo make install

...應該給你/ usr / local / bin / sort --random-sort

沒有弄亂/ usr / bin / sort

或者從MacPorts獲取:

$ sudo port install coreutils

和/或

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM