使用 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'

这会将输入转换为 nul 分隔记录,即在以 a 开头的每一行*(第一行除外)上,它会在*then 使用shufwith--zero-terminated开关之前添加一个 nul 字符,以提取五个随机记录并tr删除这些 nul 字符。

答案2

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

相关内容