如何使用 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 使用shuf
with--zero-terminated
开关之前添加一个 nul 字符,以提取五个随机记录并tr
删除这些 nul 字符。
答案2
cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'