
Как мне получить случайно выбранные пять разных элементов из списка с помощью sed? Мой список выглядит примерно так. Каждый элемент начинается со звездочки в начале строки.
* asterisk*
star
wildcard
* bee
hive
* car
tire
drive
* dove
white
peace
* eel
slippery
* fin
fish
* goat
* hinge
door
* ice
cold
* jam
bread
Мне нужны случайные пять разных предметов, например:
* hinge
door
* ice
cold
* jam
bread
* asterisk*
star
wildcard
* eel
slippery
Как мне это сделать?
Я использую OSX и не могу использовать точки с запятой в sed, и мне пришлось использовать gshuf вместо shuf. Я попробовал это:
sed -e '1b' -e 's/^*/\x0*/' mypath | gshuf -zn 5 | tr -d '\000'
но, похоже, он просто добавил литерал «x0» вместо нулевого символа и выдал мне это:
* asterisk*
star
wildcard
x0* bee
hive
x0* car
tire
drive
x0* dove
white
peace
x0* eel
slippery
x0* fin
fish
x0* goat
x0* hinge
door
x0* ice
cold
x0* jam
bread
Есть ли какое-нибудь решение этой проблемы?
решение1
С gnu sed/shuf
:
sed '1b;s/^*/\x0*/' infile | shuf -zn 5 | tr -d '\000'
Это преобразует входные данные в записи, разделенные нулями, т.е. в каждой строке, которая начинается с *
(за исключением первой), добавляется нулевой символ перед, а *
затем используется переключатель shuf
with --zero-terminated
для извлечения пяти случайных записей и tr
удаления этих нулевых символов.
решение2
cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'