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-terminated
tr
Antwort2
cat listfile | tr '\n' , | sed 's/,\*/\n*/g;s/,$//' | shuf | head -n 5 | tr , '\n'