Xáo trộn ngẫu nhiên các hàng trong một tệp văn bản lớn


11

Tôi có một tệp văn bản ~ 1GB với khoảng 6k hàng (mỗi hàng rất dài) và tôi cần xáo trộn ngẫu nhiên các hàng của nó. Có thể không? Có thể với awk?

Câu trả lời:


19

Bạn có thể sử dụng shuflệnh từ GNU coreutils . Tiện ích này khá nhanh và sẽ mất ít hơn một phút để xáo trộn tệp 1 GB.

Lệnh dưới đây có thể chỉ hoạt động trong trường hợp của bạn vì shufsẽ đọc đầu vào hoàn chỉnh trước khi mở tệp đầu ra:

$ shuf -o File.txt < File.txt

Cảm ơn, tôi quên đề cập đến tôi trên OSX, tương đương nào không?
ddmichael

6
@ddmichael Chạy brew install coreutilsvà sử dụng /usr/local/bin/gshuf.
Lri

2
@ddmichael Ngoài ra, đối với OS X, bạn có thể sử dụng lớp lót Perl này. Có một trong những blog cũ. Đã làm một bài kiểm tra nhanh và thấy làm việc. cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' Tôi lưu ý chắc chắn rằng nó sẽ chạy nhanh như thế nào
Suraj Biyani

4

Python one-liner:

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

Đọc tất cả các dòng từ đầu vào tiêu chuẩn, xáo trộn chúng tại chỗ, sau đó in chúng mà không cần thêm một dòng mới kết thúc (chú ý ,từ cuối).


2

Đối với OSX, nhị phân được gọi gshuf.

brew install coreutils
gshuf -o File.txt < File.txt

1

Nếu giống như tôi, bạn đã đến đây để tìm kiếm một thay thế shufcho macOS thì hãy sử dụng randomize-lines.

Cài đặt randomize-linesgói (homebrew), có rllệnh có chức năng tương tự 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

0

Tôi đã quên nơi tôi tìm thấy cái này, nhưng đây là shuffle.plcái tôi sử dụng:

#!/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;
}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.