Acak baris acak dalam file teks besar

11

Saya memiliki file teks ~ 1GB dengan sekitar 6k baris (setiap baris sangat panjang) dan saya perlu secara acak mengacak barisnya. Apa itu mungkin? Mungkin dengan awk?

ddmichael
sumber

Jawaban:

19

Anda dapat menggunakan shufperintah dari GNU coreutils . Utilitasnya cukup cepat dan akan memakan waktu kurang dari satu menit untuk mengacak file 1 GB.

Perintah di bawah ini mungkin hanya berfungsi dalam kasus Anda karena shufakan membaca input lengkap sebelum membuka file output:

$ shuf -o File.txt < File.txt
Suraj Biyani
sumber
Terima kasih, saya lupa menyebutkan saya menggunakan OSX, ada yang setara?
ddmichael
6
@ddmichael Jalankan brew install coreutilsdan gunakan /usr/local/bin/gshuf.
Lri
2
@ddmichael Sebagai alternatif untuk OS X Anda dapat menggunakan Perl one liner ini. Punya ini salah satu blog lama. Melakukan tes cepat dan ternyata bekerja. cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' Saya perhatikan pasti seberapa cepat akan berjalan
Suraj Biyani
4

Python one-liner:

python -c 'import sys, random; L = sys.stdin.readlines(); random.shuffle(L); print "".join(L),'

Membaca semua baris dari input standar, mengocoknya di tempat, lalu mencetaknya tanpa menambahkan baris akhir (perhatikan ,dari akhir).

Cristian Ciupitu
sumber
2

Untuk OSX biner disebut gshuf.

brew install coreutils
gshuf -o File.txt < File.txt
ishandutta2007
sumber
1

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
Ahmad Awais
sumber
0

Saya lupa di mana saya menemukan ini, tetapi inilah shuffle.plyang saya gunakan:

#!/usr/bin/perl -w

# @(#) randomize Effectively _unsort_ a text file into random order.
# 96.02.26 / drl.
# Based on Programming Perl, p 245, "Selecting random element ..."

# Set the random seed, PP, p 188
srand(time|$$);

# Suck in everything in the file.
@a = <>;

# Get random lines, write 'em out, mark 'em done.
while ( @a ) {
        $choice = splice(@a, rand @a, 1);
        print $choice;
}
Icydog
sumber
0

Setidaknya di ubuntu, ada program yang disebut shuf

shuf file.txt
Gonzo
sumber
Program itu adalah bagian dari coreutils, seperti yang disebutkan oleh Suraj Biyani .
Cristian Ciupitu