Я хочу переставить строки текстового файла случайным образом и создать новый файл. Файл может иметь несколько тысяч строк.
Как я могу сделать это с cat
, awk
, cut
, и т.д.?
Вы можете использовать shuf
. По крайней мере, на некоторых системах (отсутствует в POSIX).
Как отметил jleedev: сорт -R
также может быть опцией. По крайней мере, на некоторых системах; что ж, вы получаете картинку. Было указано , что сортировка -R
на самом деле не тасовка, а сортировка элементов по их хэш-значению.
[Примечание редактора: сортирует -R
почти тасовки, за исключением того, что дублируют строки / клавиши сортировки всегда заканчиваются рядом друг с другом . Другими словами: только с уникальными строками/клавишами это является настоящей тасовкой. Хотя верно, что порядок вывода определяется значениями хэша , случайность возникает при выборе случайной функции хэша - см. руководство . ]
Я использую Tiny Perl Script, который я называю «icsort»:
#!/usr/bin/perl
use List::Util 'shuffle';
@list = <STDIN>;
print shuffle(@list);
У меня также есть версия NULL-DELIMITED, называемая «unsort0» ... удобно для использования с нахождением -Print0 и так далее.
PS: проголосовал «Шуф» тоже, я понятия не имел, что в эти дни не имел в том, что он был в Корутилах в эти дни ... Выше может быть полезно, если ваши системы не имеют «Шуф».
Вот скрипт 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
Вот первая попытка, которые легко на кодеке, но жестко на CPU, который добавляет случайное число на каждую строку, сортирует их, а затем полоски случайного числа из каждой строки. По сути, линии сортируются случайным образом:
cat myfile | awk 'BEGIN{srand();}{print rand()"\t"$0}' | sort -k1 -n | cut -f2- > myfile.shuffled