[英]How can I randomize the lines in a file using standard tools on Red Hat Linux?
如何使用Red Hat Linux上的標准工具隨機化文件中的行?
我沒有shuf
命令,所以我正在尋找像perl
或awk
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.