Wiem, że mogę użyć seq
do wygenerowania losowej listy liczb: 1, 2, 3, 4 ...
Chcę uporządkować te liczby w losowej kolejności, takiej jak 3, 1, 4, 2 ...
Wiem, że mogę użyć, shuf
aby przetasować linie pliku. Więc mógłbym użyć seq
do zapisania losowych liczb w pliku, a następnie użyć ich shuf
do losowego losowania - lub napisać jakąś funkcję losowego losowania. Ale wydaje się to niepotrzebnie skomplikowane. Czy istnieje prostszy sposób na randomizację elementów w tablicy za pomocą jednego polecenia?
command-line
seq
bernie2436
źródło
źródło
echo $(seq 10 | shuf)
zbliża się, ale nie robi przecinków.paste
...paste
że to zrobiłem. Dzięki za nauczenie mnie. Zyskaj głos.join
ipaste
. Te 2 narzędzia są niezwykle potężne.Zakładając, że masz tablicę liczb całkowitych dziesiętnych:
Możesz użyć
printf
ishuf
do randomizacji elementów tablicy:(powyższe zakłada, że nie zmodyfikowałeś
$IFS
).Jeśli wszystko, czego potrzebujesz, to liczby losowe między dwiema liczbami całkowitymi, powiedzmy
10
i20
, nie potrzebujesz żadnych dodatkowych procesów pozashuf
użyciem-i
opcji:Cytowanie z
man shuf
:źródło
shuf --help
ale próbowałem użyćshuf -i 1 10
bez ingerencji-dash.
no cóż, dobra robota - miej moje poparcie.Nie potrzebujesz nawet
for
pętli.WYNIK
Aby umieścić je w tablicy powłok:
WYNIK
A potem są w twojej powłoce.
Jeśli umieścisz je w tablicy powłok, nie potrzebujesz nawet
printf
:WYNIK
Nawiasem mówiąc,
seq
iprintf
są trochę dla siebie stworzeni. Na przykład, jeśli chcę powtórzyć ciąg 1000 razy?WYNIK
... 999
a string
linii później ...Lub...
WYNIK
Chcę wykonać polecenie 39 razy?
WYNIK
... 38
run
linii później ...źródło
Możesz użyć
shuf
polecenia, aby losowo wygenerować dane wyjściowe, npźródło
POSIXly, aby wygenerować przetasowaną listę liczb całkowitych dziesiętnych od
min
domax
:Uważaj, że przy wielu implementacjach awk, dwukrotne uruchomienie tego polecenia w tej samej sekundzie da ten sam wynik (jako
srand()
ziarno generatora pseudolosowego na podstawie bieżącego czasu).źródło