ฉันมีไฟล์ข้อความ ~ 1GB มีประมาณ 6k แถว (แต่ละแถวยาวมาก) และฉันต้องสุ่มสลับแถวของมัน เป็นไปได้ไหม? เป็นไปได้ด้วย awk?
ฉันมีไฟล์ข้อความ ~ 1GB มีประมาณ 6k แถว (แต่ละแถวยาวมาก) และฉันต้องสุ่มสลับแถวของมัน เป็นไปได้ไหม? เป็นไปได้ด้วย awk?
คำตอบ:
คุณสามารถใช้shuf
คำสั่งจากcoreutils GNU ยูทิลิตี้ค่อนข้างเร็วและใช้เวลาน้อยกว่าหนึ่งนาทีสำหรับการสับไฟล์ขนาด 1 GB
คำสั่งด้านล่างอาจใช้งานได้ในกรณีของคุณเนื่องจากshuf
จะอ่านอินพุตที่สมบูรณ์ก่อนที่จะเปิดไฟล์เอาต์พุต:
$ shuf -o File.txt < File.txt
brew install coreutils
/usr/local/bin/gshuf
cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);'
ฉันทราบว่ามันจะทำงานได้เร็วแค่ไหน
Python หนึ่งซับ:
python -c 'import sys, random; L = sys.stdin.readlines(); random.shuffle(L); print "".join(L),'
อ่านบรรทัดทั้งหมดจากอินพุตมาตรฐานสับเข้าที่แบบจากนั้นพิมพ์โดยไม่ต้องเพิ่มบรรทัดใหม่ที่สิ้นสุด (สังเกต,
จากส่วนท้าย)
สำหรับ OSX gshuf
ไบนารีที่เรียกว่า
brew install coreutils
gshuf -o File.txt < File.txt
ถ้าเช่นฉันคุณมาที่นี่เพื่อมองหาทางเลือกเพื่อshuf
สำหรับ MacOS randomize-lines
แล้วการใช้งาน
ติดตั้งrandomize-lines
(homebrew) แพคเกจซึ่งมีคำสั่งที่มีการทำงานคล้ายกับrl
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
ฉันลืมที่ฉันพบสิ่งนี้ แต่นี่คือสิ่งshuffle.pl
ที่ฉันใช้:
#!/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;
}
อย่างน้อยใน Ubuntu มีโปรแกรมที่เรียกว่า shuf
shuf file.txt