Yap, ada beberapa jawaban bagus lainnya dalam pertanyaan awal itu juga.
Ruggiero Spearman
jadi, apakah Anda membuat daftar kata wpa? (tebakan acak)
thahgr
Jawaban:
360
Anda bisa menggunakannya shuf. Paling tidak pada beberapa sistem (tampaknya tidak ada dalam POSIX).
Seperti yang ditunjukkan oleh jleedev: sort -Rmungkin juga menjadi pilihan. Setidaknya pada beberapa sistem; yah, Anda mendapatkan fotonya. Telah ditunjukkan bahwa sort -Rtidak benar-benar mengacak tetapi mengurutkan item sesuai dengan nilai hash mereka.
[Catatan Editor: sort -Rhampir mengocok, kecuali bahwa garis duplikat / kunci sortir selalu berakhir bersebelahan . Dengan kata lain: hanya dengan jalur input / kunci unik yang benar-benar acak. Meskipun benar bahwa urutan output ditentukan oleh nilai hash , keacakan berasal dari memilih fungsi hash acak - lihat manual .]
shufdan sort -Rsedikit berbeda, karena sort -Rmemerintahkan elemen secara acak sesuai hash , yang sort -Rakan menyatukan elemen yang diulang, sementara shufmengocok semua elemen secara acak.
SeMeKh
146
Untuk pengguna OS X brew install coreutilsgshuf ...
:,
15
sort -Rdan shufharus dilihat sebagai sangat berbeda. sort -Rbersifat deterministik. Jika Anda memanggilnya dua kali pada waktu yang berbeda pada input yang sama, Anda akan mendapatkan jawaban yang sama. shuf, di sisi lain, menghasilkan output acak, sehingga kemungkinan besar akan memberikan output berbeda pada input yang sama.
EfForEffort
18
Itu tidak benar. "sort -R" menggunakan kunci hash acak yang berbeda setiap kali Anda memintanya, sehingga menghasilkan output yang berbeda setiap kali.
Mark Pettit
3
Catatan tentang keacakan: per dokumen GNU, "Secara default perintah ini menggunakan generator pseudo-acak internal yang diinisialisasi oleh sejumlah kecil entropi, tetapi dapat diarahkan untuk menggunakan sumber eksternal dengan opsi file --random-source = file."
Royce Williams
85
Perl one-liner akan menjadi versi sederhana dari solusi Maxim
Ini adalah satu-satunya skrip pada halaman ini yang menghasilkan garis acak NYATA. Solusi awk lainnya sering kali mencetak hasil rangkap.
Felipe Alvarez
1
Tapi hati-hati karena di luar Anda akan kehilangan satu baris :) Itu hanya akan bergabung dengan baris lain :)
JavaRunner
@JavaRunner: Saya berasumsi Anda sedang berbicara tentang input tanpa trailing \n; ya, yang \nharus hadir - dan itu biasanya adalah - jika tidak Anda akan mendapatkan apa yang Anda gambarkan.
mklement0
1
Sangat singkat. Saya menyarankan untuk mengganti <STDIN>dengan <>, jadi solusinya bekerja dengan input dari file juga.
mklement0
60
Jawaban ini melengkapi banyak jawaban hebat yang ada dengan cara-cara berikut:
Jawaban yang ada dikemas ke dalam fungsi shell fleksibel :
Fungsi tidak hanya mengambil stdininput, tetapi juga argumen nama file
Fungsi mengambil langkah-langkah tambahan untuk menangani SIGPIPEdengan cara biasa (penghentian diam dengan kode keluar 141), sebagai lawan melanggar berisik. Hal ini penting ketika pipa output fungsi untuk pipa yang ditutup lebih awal, seperti ketika pipa ke head.
Sebuah perbandingan kinerja dibuat.
POSIX-compliant fungsi berdasarkan awk, sortdancut , diadaptasi dari jawaban OP sendiri :
Fungsi berbasis- python , diadaptasi dari jawaban scai :
shuf(){ python -c '
import sys, random, fileinput; from signal import signal, SIGPIPE, SIG_DFL;
signal(SIGPIPE, SIG_DFL); lines=[line for line in fileinput.input()];
random.shuffle(lines); sys.stdout.write("".join(lines))
'"$@";}
Lihat bagian bawah untuk versi Windows dari fungsi ini.
Catatan: Angka-angka ini diperoleh pada iMac akhir 2012 dengan 3,2 GHz Intel Core i5 dan Fusion Drive, menjalankan OSX 10.10.3. Sementara pengaturan waktu akan bervariasi dengan OS yang digunakan, spesifikasi mesin, awkimplementasi yang digunakan (misalnya, awkversi BSD yang digunakan pada OSX biasanya lebih lambat daripada GNU awkdan khususnya mawk), ini harus memberikan perasaan umum tentang kinerja relatif .
File input adalah file 1-juta-baris yang dihasilkan seq -f 'line %.0f' 1000000.
Waktu terdaftar dalam urutan menaik (tercepat pertama):
shuf
0.090s
Ruby 2.0.0
0.289s
Perl 5.18.2
0.589s
Python
1.342sdengan Python 2.7.6; 2.407s(!) dengan Python 3.4.2
awk+ sort+cut
3.003sdengan BSD awk; 2.388sdengan GNU awk(4.1.1); 1.811sdengan mawk(1.3.4);
Untuk perbandingan lebih lanjut, solusi yang tidak dikemas sebagai fungsi di atas:
sort -R (bukan shuffle sejati jika ada jalur input duplikat)
10.661s - mengalokasikan lebih banyak memori sepertinya tidak membuat perbedaan
Scala
24.229s
bash loop + sort
32.593s
Kesimpulan :
Gunakan shuf, jika Anda bisa - ini yang tercepat sejauh ini.
Ruby bekerja dengan baik, diikuti oleh Perl .
Python jauh lebih lambat daripada Ruby dan Perl, dan, membandingkan versi Python, 2.7.6 sedikit lebih cepat dari 3.4.1
Gunakan combo + awk+ yang sesuai dengan POSIX sebagai pilihan terakhirsortcut ; yang awkpelaksanaannya Anda menggunakan hal-hal ( mawklebih cepat dari GNU awk, BSD awkpaling lambat).
Tinggal jauh dari sort -R, bashloop, dan Scala.
Versi Windows dari solusi Python (kode Python identik, kecuali untuk variasi dalam kutipan dan penghapusan pernyataan terkait sinyal, yang tidak didukung pada Windows):
Untuk PowerShell (di Windows PowerShell, Anda harus menyesuaikan $OutputEncodingjika Anda ingin mengirim karakter non-ASCII melalui pipa):
# Call as `shuf someFile.txt` or `Get-Content someFile.txt | shuf`function shuf {
$Input | python -c @'
import sys, random, fileinput;
lines=[line for line in fileinput.input()];
random.shuffle(lines); sys.stdout.write(''.join(lines))
'@ $args }
Perhatikan bahwa PowerShell dapat secara acak mengocok melalui Get-Randomcmdlet -nya (meskipun kinerja mungkin menjadi masalah); misalnya: Get-Content someFile.txt | Get-Random -Count ([int]::MaxValue)
Untuk cmd.exe(file batch):
Simpan ke file shuf.cmd, misalnya:
@echo off
python -c "import sys, random, fileinput; lines=[line for line in fileinput.input()]; random.shuffle(lines); sys.stdout.write(''.join(lines))"%*
SIGPIPE tidak ada di Windows, jadi saya menggunakan one-liner sederhana ini sebagai gantinya:python -c "import sys, random; lines = [x for x in sys.stdin.read().splitlines()] ; random.shuffle(lines); print(\"\n\".join([line for line in lines]));"
syarat
@elig: Terima kasih, tetapi menghilangkan from signal import signal, SIGPIPE, SIG_DFL; signal(SIGPIPE, SIG_DFL);dari solusi asli sudah cukup, dan mempertahankan fleksibilitas karena juga mampu melewati argumen nama file - tidak perlu mengubah apa pun (kecuali untuk mengutip) - silakan lihat bagian baru yang saya tambahkan di bawah.
mklement0
27
Saya menggunakan skrip perl kecil, yang saya sebut "unsort":
#!/usr/bin/perl
use List::Util'shuffle';@list=<STDIN>;
print shuffle(@list);
Saya juga punya versi terbatas-NULL, yang disebut "unsort0" ... berguna untuk digunakan dengan find -print0 dan seterusnya.
PS: Dipilih sebagai 'shuf' juga, saya tidak tahu bahwa ada di coreutils hari ini ... di atas mungkin masih berguna jika sistem Anda tidak memiliki 'shuf'.
Bagus sekali; Saya sarankan mengganti <STDIN>dengan <>untuk membuat pekerjaan solusi dengan masukan dari file juga.
mklement0
20
Berikut ini adalah percobaan pertama yang mudah pada koder tetapi sulit pada CPU yang menambahkan angka acak ke setiap baris, mengurutkan mereka dan kemudian menghapus nomor acak dari setiap baris. Akibatnya, garis diurutkan secara acak:
Benar, saya debug dengan head myfile | awk .... Lalu saya hanya mengubahnya menjadi kucing; itu sebabnya dibiarkan di sana.
Ruggiero Spearman
Tidak perlu -k1 -ndisortir, karena output awk rand()adalah desimal antara 0 dan 1 dan karena yang penting adalah bahwa ia akan disusun ulang entah bagaimana. -k1mungkin membantu mempercepatnya dengan mengabaikan sisa baris, meskipun output rand () harus cukup unik untuk membuat hubungan pendek perbandingan.
bonsaiviking
@ ghostdog74: Kebanyakan penggunaan kucing yang tidak berguna sebenarnya berguna untuk konsisten antara perintah yang di-piped dan tidak. Lebih baik menyimpan cat filename |(atau < filename |) daripada mengingat bagaimana setiap program mengambil input file (atau tidak).
Bagus sekali, tetapi dalam praktiknya jauh lebih lambat daripada jawaban OP sendiri , yang menggabungkan awkdengan sortdan cut. Untuk tidak lebih dari beberapa ribu baris itu tidak membuat banyak perbedaan, tetapi dengan jumlah garis yang lebih tinggi itu penting (ambang batas tergantung pada awkimplementasi yang digunakan). Penyederhanaan sedikit akan menggantikan while (1){dan if (e==d) {break}dengan garis while (e<d).
"kekurangannya" tidak spesifik untuk Python. Hingga periode PRNG dapat diselesaikan dengan memasang kembali PRNG dengan entropi dari sistem seperti /dev/urandomhalnya. Untuk menggunakannya dari Python: random.SystemRandom().shuffle(L).
jfs
bukankah join () harus ada di '\ n' sehingga garis-garisnya dicetak masing-masing?
syarat
@elig: Tidak, karena .readLines()mengembalikan garis dengan baris baru tambahan.
mklement0
9
Fungsi berbasis awk sederhana akan melakukan pekerjaan:
Ini harus bekerja pada hampir semua UNIX. Diuji di Linux, Solaris dan HP-UX.
Memperbarui:
Perhatikan, bahwa nol di depan ( %06d) dan rand()multiplikasi membuatnya bekerja dengan baik juga pada sistem yang sorttidak memahami angka. Itu dapat diurutkan melalui urutan leksikografis (alias perbandingan string normal).
Ide bagus untuk mengemas jawaban OP sendiri sebagai fungsi; jika Anda menambahkan "$@", itu juga akan berfungsi dengan file sebagai input. Tidak ada alasan untuk berkembang biak rand(), karena sort -nmampu mengurutkan pecahan desimal. Namun, ide yang baik untuk mengontrol awkformat output, karena dengan format default %.6g,, rand()akan menampilkan angka sesekali dalam notasi eksponensial . Sementara mengocok hingga 1 juta baris bisa dibilang cukup dalam praktiknya, mudah untuk mendukung lebih banyak lini tanpa membayar banyak penalti kinerja; mis %.17f.
mklement0
1
@ mklement0 Saya tidak melihat jawaban OPs saat menulis milik saya. rand () dikalikan dengan 10e6 untuk membuatnya bekerja dengan solaris atau hpux sorting sejauh yang saya ingat. Ide bagus dengan "$ @"
Michał Šrajer
1
Terima kasih, terima kasih; mungkin Anda bisa menambahkan alasan ini untuk perkalian dengan jawaban itu sendiri; umumnya, menurut POSIX, sortharus mampu menangani pecahan desimal (bahkan dengan ribuan pemisah, seperti yang baru saja saya perhatikan).
Hal-hal besar; Jika Anda menggunakan puts ARGF.readlines.shuffle, Anda bisa membuatnya bekerja dengan input stdin dan argumen nama file.
mklement0
Bahkan lebih pendek ruby -e 'puts $<.sort_by{rand}'- ARGF sudah merupakan enumerable, jadi kita dapat mengacak garis dengan mengurutkannya dengan nilai acak.
akuhn
6
Satu liner untuk Python berdasarkan jawaban scai , tetapi a) mengambil stdin, b) membuat hasil berulang dengan seed, c) memilih hanya 200 dari semua baris.
Ini adalah skrip python yang saya simpan sebagai rand.py di folder rumah saya:
#!/bin/python
import sys
import random
if __name__ =='__main__':
with open(sys.argv[1],'r') as f:
flist = f.readlines()
random.shuffle(flist)for line in flist:
print line.strip()
Di Mac OSX sort -Rdan shuftidak tersedia sehingga Anda dapat alias ini di bash_profile Anda sebagai:
Jika seperti saya Anda datang ke sini untuk mencari alternatif shufuntuk MacOS kemudian gunakan randomize-lines.
Instal randomize-lines(homebrew) paket, yang memiliki rlperintah yang memiliki fungsi serupa dengan shuf.
brew install randomize-lines
Usage: rl [OPTION]...[FILE]...Randomize the lines of a file (or stdin).-c,--count=N select N lines from the file
-r,--reselect lines may be selected multiple times
-o,--output=FILE
send output to file
-d,--delimiter=DELIM
specify line delimiter (one character)-0,--null set line delimiter to null character
(useful with find -print0)-n,--line-number
print line number with output lines
-q,--quiet,--silent
do not output any errors or warnings
-h,--help display this help and exit
-V,--version output version information and exit
Solusi bash bagus yang sejajar dengan solusi buatan OP sendiri awk, tetapi kinerja akan menjadi masalah dengan input yang lebih besar; penggunaan $RANDOMnilai tunggal Anda mengocok dengan benar hanya hingga 32.768 jalur input; sementara Anda dapat memperluas rentang itu, itu mungkin tidak sepadan: misalnya, di komputer saya, menjalankan skrip Anda di 32.768 jalur input pendek membutuhkan waktu sekitar 1 detik, yaitu sekitar 150 kali lebih lama dari shufwaktu berjalan , dan sekitar 10-15 kali selama awksolusi yang dibantu sendiri OP mengambil. Jika Anda bisa mengandalkan sortkehadiran, awkharus ada di sana juga.
mklement0
0
Di windows Anda dapat mencoba file batch ini untuk membantu Anda mengocok data.txt Anda, Penggunaan kode batch
C:\> type list.txt | shuffle.bat > maclist_temp.txt
Setelah mengeluarkan perintah ini, maclist_temp.txt akan berisi daftar garis acak.
Jawaban:
Anda bisa menggunakannya
shuf
. Paling tidak pada beberapa sistem (tampaknya tidak ada dalam POSIX).Seperti yang ditunjukkan oleh jleedev:
sort -R
mungkin juga menjadi pilihan. Setidaknya pada beberapa sistem; yah, Anda mendapatkan fotonya. Telah ditunjukkan bahwasort -R
tidak benar-benar mengacak tetapi mengurutkan item sesuai dengan nilai hash mereka.[Catatan Editor:
sort -R
hampir mengocok, kecuali bahwa garis duplikat / kunci sortir selalu berakhir bersebelahan . Dengan kata lain: hanya dengan jalur input / kunci unik yang benar-benar acak. Meskipun benar bahwa urutan output ditentukan oleh nilai hash , keacakan berasal dari memilih fungsi hash acak - lihat manual .]sumber
shuf
dansort -R
sedikit berbeda, karenasort -R
memerintahkan elemen secara acak sesuai hash , yangsort -R
akan menyatukan elemen yang diulang, sementarashuf
mengocok semua elemen secara acak.brew install coreutils
gshuf ...
sort -R
danshuf
harus dilihat sebagai sangat berbeda.sort -R
bersifat deterministik. Jika Anda memanggilnya dua kali pada waktu yang berbeda pada input yang sama, Anda akan mendapatkan jawaban yang sama.shuf
, di sisi lain, menghasilkan output acak, sehingga kemungkinan besar akan memberikan output berbeda pada input yang sama.Perl one-liner akan menjadi versi sederhana dari solusi Maxim
sumber
\n
; ya, yang\n
harus hadir - dan itu biasanya adalah - jika tidak Anda akan mendapatkan apa yang Anda gambarkan.<STDIN>
dengan<>
, jadi solusinya bekerja dengan input dari file juga.Jawaban ini melengkapi banyak jawaban hebat yang ada dengan cara-cara berikut:
Jawaban yang ada dikemas ke dalam fungsi shell fleksibel :
stdin
input, tetapi juga argumen nama fileSIGPIPE
dengan cara biasa (penghentian diam dengan kode keluar141
), sebagai lawan melanggar berisik. Hal ini penting ketika pipa output fungsi untuk pipa yang ditutup lebih awal, seperti ketika pipa kehead
.Sebuah perbandingan kinerja dibuat.
awk
,sort
dancut
, diadaptasi dari jawaban OP sendiri :Lihat bagian bawah untuk versi Windows dari fungsi ini.
Perbandingan kinerja:
Catatan: Angka-angka ini diperoleh pada iMac akhir 2012 dengan 3,2 GHz Intel Core i5 dan Fusion Drive, menjalankan OSX 10.10.3. Sementara pengaturan waktu akan bervariasi dengan OS yang digunakan, spesifikasi mesin,
awk
implementasi yang digunakan (misalnya,awk
versi BSD yang digunakan pada OSX biasanya lebih lambat daripada GNUawk
dan khususnyamawk
), ini harus memberikan perasaan umum tentang kinerja relatif .File input adalah file 1-juta-baris yang dihasilkan
seq -f 'line %.0f' 1000000
.Waktu terdaftar dalam urutan menaik (tercepat pertama):
shuf
0.090s
0.289s
0.589s
1.342s
dengan Python 2.7.6;2.407s
(!) dengan Python 3.4.2awk
+sort
+cut
3.003s
dengan BSDawk
;2.388s
dengan GNUawk
(4.1.1);1.811s
denganmawk
(1.3.4);Untuk perbandingan lebih lanjut, solusi yang tidak dikemas sebagai fungsi di atas:
sort -R
(bukan shuffle sejati jika ada jalur input duplikat)10.661s
- mengalokasikan lebih banyak memori sepertinya tidak membuat perbedaan24.229s
bash
loop +sort
32.593s
Kesimpulan :
shuf
, jika Anda bisa - ini yang tercepat sejauh ini.awk
+ yang sesuai dengan POSIX sebagai pilihan terakhirsort
cut
; yangawk
pelaksanaannya Anda menggunakan hal-hal (mawk
lebih cepat dari GNUawk
, BSDawk
paling lambat).sort -R
,bash
loop, dan Scala.Versi Windows dari solusi Python (kode Python identik, kecuali untuk variasi dalam kutipan dan penghapusan pernyataan terkait sinyal, yang tidak didukung pada Windows):
$OutputEncoding
jika Anda ingin mengirim karakter non-ASCII melalui pipa):Perhatikan bahwa PowerShell dapat secara acak mengocok melalui
Get-Random
cmdlet -nya (meskipun kinerja mungkin menjadi masalah); misalnya:Get-Content someFile.txt | Get-Random -Count ([int]::MaxValue)
cmd.exe
(file batch):Simpan ke file
shuf.cmd
, misalnya:sumber
python -c "import sys, random; lines = [x for x in sys.stdin.read().splitlines()] ; random.shuffle(lines); print(\"\n\".join([line for line in lines]));"
from signal import signal, SIGPIPE, SIG_DFL; signal(SIGPIPE, SIG_DFL);
dari solusi asli sudah cukup, dan mempertahankan fleksibilitas karena juga mampu melewati argumen nama file - tidak perlu mengubah apa pun (kecuali untuk mengutip) - silakan lihat bagian baru yang saya tambahkan di bawah.Saya menggunakan skrip perl kecil, yang saya sebut "unsort":
Saya juga punya versi terbatas-NULL, yang disebut "unsort0" ... berguna untuk digunakan dengan find -print0 dan seterusnya.
PS: Dipilih sebagai 'shuf' juga, saya tidak tahu bahwa ada di coreutils hari ini ... di atas mungkin masih berguna jika sistem Anda tidak memiliki 'shuf'.
sumber
<STDIN>
dengan<>
untuk membuat pekerjaan solusi dengan masukan dari file juga.Berikut ini adalah percobaan pertama yang mudah pada koder tetapi sulit pada CPU yang menambahkan angka acak ke setiap baris, mengurutkan mereka dan kemudian menghapus nomor acak dari setiap baris. Akibatnya, garis diurutkan secara acak:
sumber
head myfile | awk ...
. Lalu saya hanya mengubahnya menjadi kucing; itu sebabnya dibiarkan di sana.-k1 -n
disortir, karena output awkrand()
adalah desimal antara 0 dan 1 dan karena yang penting adalah bahwa ia akan disusun ulang entah bagaimana.-k1
mungkin membantu mempercepatnya dengan mengabaikan sisa baris, meskipun output rand () harus cukup unik untuk membuat hubungan pendek perbandingan.cat filename |
(atau< filename |
) daripada mengingat bagaimana setiap program mengambil input file (atau tidak).inilah skrip awk
keluaran
sumber
awk
dengansort
dancut
. Untuk tidak lebih dari beberapa ribu baris itu tidak membuat banyak perbedaan, tetapi dengan jumlah garis yang lebih tinggi itu penting (ambang batas tergantung padaawk
implementasi yang digunakan). Penyederhanaan sedikit akan menggantikanwhile (1){
danif (e==d) {break}
dengan gariswhile (e<d)
.Satu kalimat untuk python:
Dan untuk mencetak hanya satu baris acak:
Tetapi lihat posting ini untuk kelemahan python
random.shuffle()
. Itu tidak akan bekerja dengan baik dengan banyak (lebih dari 2080) elemen.sumber
/dev/urandom
halnya. Untuk menggunakannya dari Python:random.SystemRandom().shuffle(L)
..readLines()
mengembalikan garis dengan baris baru tambahan.Fungsi berbasis awk sederhana akan melakukan pekerjaan:
pemakaian:
Ini harus bekerja pada hampir semua UNIX. Diuji di Linux, Solaris dan HP-UX.
Memperbarui:
Perhatikan, bahwa nol di depan (
%06d
) danrand()
multiplikasi membuatnya bekerja dengan baik juga pada sistem yangsort
tidak memahami angka. Itu dapat diurutkan melalui urutan leksikografis (alias perbandingan string normal).sumber
"$@"
, itu juga akan berfungsi dengan file sebagai input. Tidak ada alasan untuk berkembang biakrand()
, karenasort -n
mampu mengurutkan pecahan desimal. Namun, ide yang baik untuk mengontrolawk
format output, karena dengan format default%.6g
,,rand()
akan menampilkan angka sesekali dalam notasi eksponensial . Sementara mengocok hingga 1 juta baris bisa dibilang cukup dalam praktiknya, mudah untuk mendukung lebih banyak lini tanpa membayar banyak penalti kinerja; mis%.17f
.sort
harus mampu menangani pecahan desimal (bahkan dengan ribuan pemisah, seperti yang baru saja saya perhatikan).Ruby FTW:
sumber
puts ARGF.readlines.shuffle
, Anda bisa membuatnya bekerja dengan input stdin dan argumen nama file.ruby -e 'puts $<.sort_by{rand}'
- ARGF sudah merupakan enumerable, jadi kita dapat mengacak garis dengan mengurutkannya dengan nilai acak.Satu liner untuk Python berdasarkan jawaban scai , tetapi a) mengambil stdin, b) membuat hasil berulang dengan seed, c) memilih hanya 200 dari semua baris.
sumber
Cara yang sederhana dan intuitif akan digunakan
shuf
.Contoh:
Asumsikan
words.txt
sebagai:Untuk mengocok garis, lakukan:
yang akan melempar garis yang dikocok ke output standar ; Jadi, Anda harus mem - pipe- nya ke file output seperti:
Satu menjalankan acak seperti itu dapat menghasilkan:
sumber
Kami memiliki paket untuk melakukan pekerjaan:
Contoh:
Buat daftar angka yang diurutkan, dan simpan ke 1000.txt:
untuk mengocoknya, cukup gunakan
sumber
Ini adalah skrip python yang saya simpan sebagai rand.py di folder rumah saya:
Di Mac OSX
sort -R
danshuf
tidak tersedia sehingga Anda dapat alias ini di bash_profile Anda sebagai:sumber
Jika seperti saya Anda datang ke sini untuk mencari alternatif
shuf
untuk MacOS kemudian gunakanrandomize-lines
.Instal
randomize-lines
(homebrew) paket, yang memilikirl
perintah yang memiliki fungsi serupa denganshuf
.brew install randomize-lines
sumber
brew install coreutils
menyediakanshuf
biner sebagaigshuf
.Jika Anda telah menginstal Scala, berikut ini adalah one-liner untuk mengacak input:
sumber
Fungsi bash ini memiliki ketergantungan minimal (hanya sort and bash):
sumber
awk
, tetapi kinerja akan menjadi masalah dengan input yang lebih besar; penggunaan$RANDOM
nilai tunggal Anda mengocok dengan benar hanya hingga 32.768 jalur input; sementara Anda dapat memperluas rentang itu, itu mungkin tidak sepadan: misalnya, di komputer saya, menjalankan skrip Anda di 32.768 jalur input pendek membutuhkan waktu sekitar 1 detik, yaitu sekitar 150 kali lebih lama darishuf
waktu berjalan , dan sekitar 10-15 kali selamaawk
solusi yang dibantu sendiri OP mengambil. Jika Anda bisa mengandalkansort
kehadiran,awk
harus ada di sana juga.Di windows Anda dapat mencoba file batch ini untuk membantu Anda mengocok data.txt Anda, Penggunaan kode batch
Setelah mengeluarkan perintah ini, maclist_temp.txt akan berisi daftar garis acak.
Semoga ini membantu.
sumber
Belum disebutkan:
The
unsort
util. Sintaks (berorientasi playlist):msort
dapat mengocok per baris, tetapi biasanya berlebihan:sumber
awk
Varian lain :sumber