Abrufen von fünf zufälligen Elementen aus einer Liste mit sed

Abrufen von fünf zufälligen Elementen aus einer Liste mit sed

Wie kann ich mit sed zufällig ausgewählte fünf verschiedene Elemente aus einer Liste abrufen? Meine Liste sieht ungefähr so ​​aus wie unten. Jedes Element beginnt mit einem Sternchen am Anfang einer Zeile.

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

Ich möchte fünf zufällig ausgewählte Artikel wie diese:

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

Wie kann ich das machen?

Ich verwende OSX und konnte in sed keine Semikolons verwenden und musste gshuf statt shuf verwenden. Ich habe Folgendes versucht:

sed -e '1b' -e 's/^*/\x0*/' mypath | gshuf -zn 5 | tr -d '\000'

aber anscheinend wurden anstelle des Nullzeichens einfach die wörtlichen „x0“ hinzugefügt, und ich erhielt Folgendes:

* 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

Gibt es dafür eine Problemumgehung?

Antwort1

Mit gnu sed/shuf:

sed '1b;s/^*/\x0*/' infile | shuf -zn 5 | tr -d '\000'

Dadurch werden die Eingaben in durch Nullen getrennte Datensätze umgewandelt, d. h. in jede Zeile, die mit einem beginnt *(außer der ersten), wird davor ein Nullzeichen eingefügt. Anschließend wird der Schalter „with *“ verwendet , um fünf zufällige Datensätze zu extrahieren und diese Nullzeichen zu löschen.shuf--zero-terminatedtr

Antwort2

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

verwandte Informationen