Извлечение пяти случайных элементов из списка с помощью sed

Извлечение пяти случайных элементов из списка с помощью sed

Как мне получить случайно выбранные пять разных элементов из списка с помощью 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'

Это преобразует входные данные в записи, разделенные нулями, т.е. в каждой строке, которая начинается с *(за исключением первой), добавляется нулевой символ перед, а *затем используется переключатель shufwith --zero-terminatedдля извлечения пяти случайных записей и trудаления этих нулевых символов.

решение2

cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'

Связанный контент