sed を使用してリストからランダムに 5 つの項目を取得する

sed を使用してリストからランダムに 5 つの項目を取得する

sed を使用してリストからランダムに選択された 5 つの異なる項目を取得するにはどうすればよいでしょうか。私のリストは以下のようなものです。各項目は行の先頭にアスタリスクで始まります。

* asterisk*
star
wildcard
* bee
hive
* car
tire
drive
* dove
white
peace
* eel
slippery
* fin
fish
* goat
* hinge
door
* ice
cold
* jam
bread

次のような 5 つの異なるアイテムをランダムに取得します。

* hinge
door
* ice
cold
* jam
bread
* asterisk*
star
wildcard
* eel
slippery

どうやってやるの?

私は OSX を使用していますが、sed でセミコロンが使えず、shuf の代わりに gshuf を使う必要がありました。私はこれを試しました:

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'

これにより、入力がヌルで区切られたレコードに変換されます。つまり、a で始まる各行*(最初の行を除く) の前にヌル文字が追加され、その後、withスイッチ*を使用して5 つのランダムなレコードが抽出され、それらのヌル文字が削除されます。shuf--zero-terminatedtr

答え2

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

関連情報