Довільно переміщуйте рядки у великому текстовому файлі


11

У мене є текстовий файл ~ 1 Гб з приблизно 6 к рядками (кожен рядок дуже довгий), і мені потрібно випадковим чином переміщувати його рядки. Це можливо? Можливо, з awk?

Відповіді:


19

Ви можете використовувати shufкоманду з GNU coreutils . Утиліта проходить досить швидко і для переміщення файлу об'ємом 1 Гб знадобиться менше хвилини.

Команда нижче може просто працювати у вашому випадку, оскільки shufпрочитає повний вхід перед відкриттям вихідного файлу:

$ shuf -o File.txt < File.txt

Дякую, я забув згадати, що я на OSX, будь-які еквіваленти?
ddmichael

6
@ddmichael Виконати brew install coreutilsта використовувати /usr/local/bin/gshuf.
Лрі

2
@ddmichael В якості альтернативи для OS X ви можете використовувати цей Perl один вкладиш. Отримав цей один із старих блогів. Зробив швидкий тест і застав працювати. cat myfile | perl -MList::Util=shuffle -e 'print shuffle(<STDIN>);' Зауважу, впевнений, як швидко він би пробіг
Сурай Біяні

4

Пітон однолінійний:

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

Прочитує всі рядки зі стандартного вводу, переміщує їх на місці, після чого друкує їх, не додаючи закінчуваного нового рядка (помічайте ,з кінця).


2

Для OSX викликається двійковий код gshuf.

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

1

Якщо ви, як я, ви прийшли сюди шукати альтернативу 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

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;
}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.