Hallo,
Aus einer rein aus Zahlen bestehenden Liste (sagen wir durchnummeriert von 0001 - 1000) würde ich gerne 10% der Elemente zufällig auswählen, also in diesem Beispiel 100 eindeutige Namen, die in diesem Bereich liegen.
Geht das?
bash: Zufällige Elemente aus einer Liste
Klar geht das. Nur ist es nicht besonders simpel, gerade in bash. Gibt es einen Grund, sowas ausgerechnet in bash machen zu wollen?
Grundsätzliches vorgehen: Zwei Listen, Quellliste, am Anfang voll, Zielliste, am Anfang leer. Ein zufälliges Element aus der Quellliste rauspicken, dort entfernen, in die Zielliste eintragen.
100 mal wiederholen.
In Tcl wär das z.B. wie folgt zu machen:
Mit bash musst du die notwendigen Stringoperationen llength, lindex und lreplace selbst schreiben.
Janka
Grundsätzliches vorgehen: Zwei Listen, Quellliste, am Anfang voll, Zielliste, am Anfang leer. Ein zufälliges Element aus der Quellliste rauspicken, dort entfernen, in die Zielliste eintragen.
100 mal wiederholen.
In Tcl wär das z.B. wie folgt zu machen:
Code: Select all
#!/usr/bin/tclsh
set q {1 2 3 4 5 6 7 8 9 10 11 12 13}
set z {}
for {set c 0} {$c<5} {incr c} {
set i [expr int(rand()*[llength $q])]
lappend z [lindex $q $i]
set q [lreplace $q $i $i]
}
puts $z
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ich mag die Schreie.
Ja, es gibt einen Grund. Das gesamte Skript ist alles bash, denn das ist das Einzige, was ich zumindest minimal kann, dies ist nur ein Auszug. Ich wüßte auch nicht, wie ich tcl in bash einbinden kann.
Bei der bash scheitere ich an den Schleifen, um auf Duplikate zu überprüfen. Ach, wie wünschte ich mir gerade goto & Zeilennummern zurück...
Trotzdem vielen Dank für Deine Mühe
Bei der bash scheitere ich an den Schleifen, um auf Duplikate zu überprüfen. Ach, wie wünschte ich mir gerade goto & Zeilennummern zurück...
Trotzdem vielen Dank für Deine Mühe
Vielen Dank erstmal,
vielleicht komme ich darauf sogar zurück. Aber mit Chance habe ich auch eine bash Lösung gefunden, kann ich aber erst morgen testen:
Gut, etwas umständlich und rechenaufwendig bei geschätzen 10 000 000 Dateien, aber wofür haben wir GHz Prozessoren?
vielleicht komme ich darauf sogar zurück. Aber mit Chance habe ich auch eine bash Lösung gefunden, kann ich aber erst morgen testen:
Code: Select all
FILES=10000000
LANGE=`echo ${#FILES}`
FAKTOR=2000000
NOADD=0
WERT=`echo $((${RANDOM}%${FILES}))`
DELETE=`echo ${WERT}`
ZAEHLER=1
while [ ${ZAEHLER} -le ${FAKTOR} ]; do
WERT=`echo $((${RANDOM}%${FILES}))`
for Y in ${DELETE}; do
if [ "${Y}" == "${WERT}" ]; then
NOADD=1
break
fi
done
if [ ! "${NOADD}" == "1" ]; then
WERT=`printf "%0${LANGE}d\n" ${WERT}`
DELETE=`echo -n ${DELETE} echo -n ${WERT}`
let ZAEHLER+=1
fi
NOADD=0
done
-
- Posts: 430
- Joined: 03. Mar 2006 23:16
Rudnis Lösung ist ja klasse.
Hier noch ein bischen bash-random.
In /etc/cron.daily/apt : darin der operative Teil:
Und die Anmerkung darin führt zu:
Hier noch ein bischen bash-random.
In /etc/cron.daily/apt :
Code: Select all
random_sleep()
{
RandomSleep=1800
eval $(apt-config shell RandomSleep APT::Periodic::RandomSleep)
if [ $RandomSleep -eq 0 ]; then
return
fi
if [ -z "$RANDOM" ] ; then
# A fix for shells that do not have this bash feature.
RANDOM=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -c"1-5")
fi
TIME=$(($RANDOM % $RandomSleep))
debug_echo "sleeping for $TIME seconds"
sleep $TIME
}
Code: Select all
RandomSleep=1800
if [ -z "$RANDOM" ] ; then
# A fix for shells that do not have this bash feature.
RANDOM=$(dd if=/dev/urandom count=1 2> /dev/null | cksum | cut -c"1-5")
fi
TIME=$(($RANDOM % $RandomSleep))
Code: Select all
$ echo $RANDOM
29640
$ echo $RANDOM
1890
$ echo $RANDOM
13575
mfg komsomolze