สุ่มสลับแถวในไฟล์ข้อความขนาดใหญ่


11

ฉันมีไฟล์ข้อความ ~ 1GB มีประมาณ 6k แถว (แต่ละแถวยาวมาก) และฉันต้องสุ่มสลับแถวของมัน เป็นไปได้ไหม? เป็นไปได้ด้วย awk?

คำตอบ:


19

คุณสามารถใช้shufคำสั่งจากcoreutils GNU ยูทิลิตี้ค่อนข้างเร็วและใช้เวลาน้อยกว่าหนึ่งนาทีสำหรับการสับไฟล์ขนาด 1 GB

คำสั่งด้านล่างอาจใช้งานได้ในกรณีของคุณเนื่องจากshufจะอ่านอินพุตที่สมบูรณ์ก่อนที่จะเปิดไฟล์เอาต์พุต:

$ shuf -o File.txt < File.txt

ขอบคุณฉันลืมที่จะพูดถึงฉันใน OSX เทียบเท่าใด ๆ
ddmichael

6
@ddmichael เรียกใช้และการใช้งานbrew install coreutils /usr/local/bin/gshuf
Lri

2
@ddmichael อีกวิธีหนึ่งสำหรับ OS X คุณสามารถใช้ Perl one liner รับหนึ่งในบล็อกเก่านี้ ทำการทดสอบอย่างรวดเร็วและพบว่าทำงานได้ cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' ฉันทราบว่ามันจะทำงานได้เร็วแค่ไหน
Suraj Biyani

4

Python หนึ่งซับ:

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

อ่านบรรทัดทั้งหมดจากอินพุตมาตรฐานสับเข้าที่แบบจากนั้นพิมพ์โดยไม่ต้องเพิ่มบรรทัดใหม่ที่สิ้นสุด (สังเกต,จากส่วนท้าย)



1

ถ้าเช่นฉันคุณมาที่นี่เพื่อมองหาทางเลือกเพื่อshufสำหรับ MacOS randomize-linesแล้วการใช้งาน

ติดตั้งrandomize-lines(homebrew) แพคเกจซึ่งมีคำสั่งที่มีการทำงานคล้ายกับrlshuf

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

0

ฉันลืมที่ฉันพบสิ่งนี้ แต่นี่คือสิ่ง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;
}

0

อย่างน้อยใน Ubuntu มีโปรแกรมที่เรียกว่า shuf

shuf file.txt

โปรแกรมที่เป็นส่วนหนึ่งของ coreutils ดังกล่าวโดยSuraj Biyani
Cristian Ciupitu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.