Red Hat Linux'ta standart araçları kullanarak bir dosyadaki satırları nasıl rastgele hale getirebilirim?
shuf
Komuta sahip değilim, bu yüzden aynı görevi yerine getiren bir perl
veya awk
tek astar gibi bir şey arıyorum .
Red Hat Linux'ta standart araçları kullanarak bir dosyadaki satırları nasıl rastgele hale getirebilirim?
shuf
Komuta sahip değilim, bu yüzden aynı görevi yerine getiren bir perl
veya awk
tek astar gibi bir şey arıyorum .
Yanıtlar:
Ve bir Perl tek astar alacaksınız!
perl -MList::Util -e 'print List::Util::shuffle <>'
Bir modül kullanır, ancak modül Perl kod dağıtımının bir parçasıdır. Bu yeterince iyi değilse, kendi oyununuzu yuvarlamayı düşünebilirsiniz.
-i
Dosyayı düzenlemesini sağlamak için bunu bayrakla ("yerinde düzenle") kullanmayı denedim . Belgeler, çalışması gerektiğini gösteriyor, ancak işe yaramıyor. Karıştırılan dosyayı hala standart çıktı olarak görüntüler, ancak bu sefer orijinali siler. Kullanmamanı öneririm.
Bir kabuk betiğini düşünün:
#!/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
Test edilmedi, ama umarım işe yarar.
ruby -e 'puts STDIN.readlines.shuffle'
. Hızın karşılaştırılabilir olup olmadığını görmek için büyük girdiler üzerinde test edilmesi gerekir. (OS X'te de çalışır)
shuf
her şeyi belleğe yükler, bu nedenle gerçekten büyük bir dosyayla çalışmaz (benimki ~ 300GB tsv'dir). Bu perl betiği benimkinde de başarısız oldu, ancak dışında hata yok Killed
. Perl çözümünün her şeyi belleğe de yükleyip yüklemediğine dair bir fikriniz var mı yoksa karşılaştığım başka bir sorun var mı?
Um, unutmayalım
sort --random-sort
brew install coreutils
Tüm yardımcı programların başında ag bulunur yani: gsort --random-sort
veya gshuf
beklendiği gibi çalışacaktır
gsort
ve gshuf
yükledimport install coreutils
shuf
Bunun yerine (linux üzerinde) kullanmayı düşünün .
shuf
en iyi yoldur.
sort -R
acı verici derecede yavaş. Sadece 5GB dosyasını sıralamayı denedim. 2,5 saat sonra pes ettim. Sonra shuf
bir dakika içinde sıraladı.
sort -R
Nedenin yavaş olduğundan şüpheleniyorum, her satır için bir hash hesaplıyor. Dokümanlardan: " Giriş anahtarlarına hash uygulayarak ve ardından hash değerlerini sıralayarak sıralayın. "
shuf
her şeyi belleğe yükler.
seq -f 'line %.0f' 1000000
için aynı, uzun zaman aldı (ile olduğundan çok, çok daha uzun shuf
).
cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
Dosyayı okuyun, her satırın başına rastgele bir sayı ekleyin, dosyayı bu rastgele öneklere göre sıralayın, daha sonra önekleri kesin. Herhangi bir yarı modern kabukta çalışması gereken tek astar.
DÜZENLEME: Richard Hansen'ın görüşlerini içeriyor.
$RANDOM
), ancak verileri parçalamak için -1. Değiştirme while read f
ile while IFS= read -r f
engeller read
kaldırma ön ve boşluk arka den (bakınız bu yanıt ) ve tersbölülerden işleme önler. Sabit uzunlukta rastgele bir dizge kullanmak, cut
baştaki boşluğun silinmesini engeller . Sonuç: cat yourfile.txt | while IFS= read -r f; do printf "%05d %s\n" "$RANDOM" "$f"; done | sort -n | cut -c7-
Python için tek satırlık bir:
python -c "import random, sys; lines = open(sys.argv[1]).readlines(); random.shuffle(lines); print ''.join(lines)," myFile
Ve sadece tek bir rastgele satır yazdırmak için:
python -c "import random, sys; print random.choice(open(sys.argv[1]).readlines())," myFile
Ama bakın bu yazı piton en dezavantajlarından için random.shuffle()
. Birçok (2080'den fazla) öğeyle iyi çalışmayacaktır.
Jim'in cevabıyla ilgili:
My ~/.bashrc
aşağıdakileri içerir:
unsort ()
{
LC_ALL=C sort -R "$@"
}
GNU coreutils'in sort, -R
= --random-sort
ile her satır için rastgele bir hash oluşturur ve ona göre sıralar. Rastgele hash, bazı eski (hatalı) sürümlerde bazı yerel ayarlarda kullanılmaz ve normal sıralı çıktı döndürmesine neden olur, bu yüzden ayarladım LC_ALL=C
.
Chris'in cevabıyla ilgili:
perl -MList::Util=shuffle -e'print shuffle<>'
biraz daha kısa tek astarlıdır. ( -Mmodule=a,b,c
kısaltmasıdır -e 'use module qw(a b c);'
.)
Basit vermenin nedeni -i
, yerinde karıştırmak için işe yaramıyor çünkü Perl print
, dosyanın okunduğu aynı döngüde gerçekleşmesini beklemesi ve print shuffle <>
tüm girdi dosyaları okunup kapatılana kadar çıktı vermemesidir.
Daha kısa bir çözüm olarak,
perl -MList::Util=shuffle -i -ne'BEGIN{undef$/}print shuffle split/^/m'
dosyaları yerinde karıştırır. ( -n
"kodu bir while (<>) {...}
döngüye sarmak ; BEGIN{undef$/}
Perl'in bir seferde satırlar yerine tek seferde dosyalar üzerinde çalışmasını sağlar ve dolaylı olarak satırlar yerine tam bir dosya ile yapıldığı split/^/m
için gereklidir $_=<>
.)
FreeBSD'nin kendi rastgele programı vardır:
cat $file | random | ...
/ Usr / games / random içinde, bu yüzden oyun yüklemediyseniz, şansınız yok.
Textproc / rand veya textproc / msort gibi bağlantı noktalarını kurmayı düşünebilirsiniz. Taşınabilirlik önemliyse, bunlar Linux ve / veya Mac OS X'te mevcut olabilir.
OSX'te, http://ftp.gnu.org/gnu/coreutils/ adresinden en son ve benzeri
./configure make sudo make install
... size / usr / local / bin / sort --random-sort vermeli
karıştırmadan / usr / bin / sort
Veya MacPorts'tan edinin:
$ sudo port install coreutils
ve / veya
$ /opt/local//libexec/gnubin/sort --random-sort