Dalam skrip Bash, saya ingin memilih garis acak N dari file input dan output ke file lain.
Bagaimana ini bisa dilakukan?
bash
shell
random
text-processing
pengguna121196
sumber
sumber
sort -R
karena melakukan banyak pekerjaan berlebih, terutama untuk file yang panjang. Anda dapat menggunakan$RANDOM
,% wc -l
,jot
,sed -n
(à la stackoverflow.com/a/6022431/563329 ), dan fungsi bash (array, pengalihan perintah, dll) untuk menentukan sendiripeek
fungsi yang benar-benar akan berjalan pada file 5.000.000-line.Jawaban:
Gunakan
shuf
dengan-n
opsi seperti yang ditunjukkan di bawah ini, untuk mendapatkanN
garis acak:sumber
sort -R
?Sortir file secara acak dan pilih
100
baris pertama :sumber
sort
sebenarnya mengurutkan garis yang identik bersama-sama, jadi jika Anda mungkin memiliki garis duplikat dan Anda telah menginstalshuf
(alat gnu), lebih baik menggunakannya untuk ini.shuf -n
bertindak cukup instan.sort -R
mungkin opsi GNU, instal GNU coreutils. btw,shuf
juga bagian dari coreutils.sort -R input | head -n <num_lines>
. File input adalah 279GB, dengan 2bi + baris. Tidak bisa membagikannya. Pokoknya, intinya adalah Anda dapat menyimpan beberapa baris dalam memori dengan shuffle untuk melakukan pemilihan acak apa yang akan dihasilkan. Sortir akan mengurutkan seluruh file, terlepas dari apa kebutuhan Anda.Yah Menurut komentar pada jawaban shuf dia mengocok 78.000 000 baris dalam waktu kurang dari satu menit.
Tantangan diterima...
EDIT: Saya mengalahkan rekor saya sendiri
powershuf melakukannya dalam 0,047 detik
Alasannya sangat cepat, baik saya tidak membaca seluruh file dan hanya memindahkan pointer file 10 kali dan mencetak baris setelah pointer.
Gitlab Repo
Usaha lama
Pertama saya membutuhkan file 78.000.000.000 baris:
Ini memberi saya file dengan 78 Miliar baris baru ;-)
Sekarang untuk bagian shuf:
Hambatannya adalah CPU dan tidak menggunakan banyak utas, itu disematkan 1 inti pada 100% 15 lainnya tidak digunakan.
Python adalah apa yang saya gunakan secara teratur sehingga itulah yang akan saya gunakan untuk membuatnya lebih cepat:
Ini membuat saya kurang dari satu menit:
Saya melakukan ini pada Lenovo X1 ekstrim 2nd gen dengan i9 dan Samsung NVMe yang memberi saya banyak kecepatan baca dan tulis.
Saya tahu ini bisa lebih cepat tetapi saya akan meninggalkan beberapa ruang untuk mencoba yang lain.
Sumber penghitung garis : Luther Blissett
sumber