Как я могу переставить строки текстового файла на командной строке Unix или в сценарии оболочки?

Я хочу переставить строки текстового файла случайным образом и создать новый файл. Файл может иметь несколько тысяч строк.

Как я могу сделать это с cat, awk, cut, и т.д.?

273
задан FcknGioconda 18 July 2018 в 18:34
поделиться

4 ответа

Вы можете использовать shuf. По крайней мере, на некоторых системах (отсутствует в POSIX).

Как отметил jleedev: сорт -R также может быть опцией. По крайней мере, на некоторых системах; что ж, вы получаете картинку. Было указано , что сортировка -R на самом деле не тасовка, а сортировка элементов по их хэш-значению.

[Примечание редактора: сортирует -R почти тасовки, за исключением того, что дублируют строки / клавиши сортировки всегда заканчиваются рядом друг с другом . Другими словами: только с уникальными строками/клавишами это является настоящей тасовкой. Хотя верно, что порядок вывода определяется значениями хэша , случайность возникает при выборе случайной функции хэша - см. руководство . ]

347
ответ дан 23 November 2019 в 02:12
поделиться

Я использую Tiny Perl Script, который я называю «icsort»:

#!/usr/bin/perl
use List::Util 'shuffle';
@list = <STDIN>;
print shuffle(@list);

У меня также есть версия NULL-DELIMITED, называемая «unsort0» ... удобно для использования с нахождением -Print0 и так далее.

PS: проголосовал «Шуф» тоже, я понятия не имел, что в эти дни не имел в том, что он был в Корутилах в эти дни ... Выше может быть полезно, если ваши системы не имеют «Шуф».

27
ответ дан 23 November 2019 в 02:12
поделиться

Вот скрипт awk

awk 'BEGIN{srand() }
{ lines[++d]=$0 }
END{
    while (1){
    if (e==d) {break}
        RANDOM = int(1 + rand() * d)
        if ( RANDOM in lines  ){
            print lines[RANDOM]
            delete lines[RANDOM]
            ++e
        }
    }
}' file

вывод

$ cat file
1
2
3
4
5
6
7
8
9
10

$ ./shell.sh
7
5
10
9
6
8
2
1
3
4
16
ответ дан 23 November 2019 в 02:12
поделиться

Вот первая попытка, которые легко на кодеке, но жестко на CPU, который добавляет случайное число на каждую строку, сортирует их, а затем полоски случайного числа из каждой строки. По сути, линии сортируются случайным образом:

cat myfile | awk 'BEGIN{srand();}{print rand()"\t"$0}' | sort -k1 -n | cut -f2- > myfile.shuffled
20
ответ дан 23 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: