Jeśli jot
jest w systemie, wtedy myślę używasz FreeBSD lub OSX zamiast Linux, więc prawdopodobnie nie mają narzędzi, takich jak rl
lub sort -R
dostępne.
Bez obaw. Musiałem to zrobić jakiś czas temu. Spróbuj zamiast tego:
[[email protected] ~]$ cat rndlines
#!/bin/sh
# default to 3 lines of output
lines="${1:-3}"
# First, put a random number at the begginning of each line.
while read line; do
echo "`jot -r 1 1 1000000` $line"
done <input.txt> stage1.txt
# Next, sort by the random number.
sort -n stage1.txt > stage2.txt
# Last, remove the number from the start of each line.
sed -r 's/^[0-9]+ //' stage2.txt > stage3.txt
# Show our output
head -n "$lines" stage3.txt
# Clean up
rm stage1.txt stage2.txt stage3.txt
[[email protected] ~]$ ./rndlines input.txt
two
one
five
[[email protected] ~]$ ./rndlines input.txt
four
two
three
[[email protected] ~]$
Mój input.txt
ma pięć linii o nazwanych numerach.
Wypisałem to dla łatwiejszego czytania, ale w rzeczywistości można łączyć rzeczy w długie rury, a będziesz chciał wyczyścić dowolne (jednoznacznie nazwane) pliki tymczasowe, które możesz utworzyć.
Oto przykład 1-linia, która także wstawia liczbę losową trochę bardziej czysto używając awk:
$ printf 'one\ntwo\nthree\nfour\nfive\n' | awk 'BEGIN{srand()} {printf("%.20f %s\n", rand(), $0)}' | sort | head -n 3 | cut -d\ -f2-
Należy pamiętać, że starsze wersje sed
(w FreeBSD i OSX) może wymagać opcję -E
zamiast -r
do obsługi ERE zamiast lub dialektu BRE w wyrażeniu regularnym. (Oczywiście, możesz wyrazić to w BRE, ale dlaczego?) (Starożytne wersje sed
(HP/UX, itp.) Mogą wymagać BRE, ale używałbyś ich tylko, gdybyś już wiedział, jak to zrobić.)
To wygląda jak to będzie pracować dla mnie, bez potrzeby instalowania żadnych dodatkowych narzędzi lub języki (perl, python, bash). Masz rację, używam FreeBSD. Dzięki za spisanie wszystkiego. Połączę te polecenia z rurkami, aby były bardziej zwarte. – Graham
cat/path/to/file | awk 'BEGIN {srand()} {print rand() "\ t" 0 0} "| sort -n | cut -f2-> /path/to/random.file – CodeReaper
@CodeReaper - ya, używając awk i cut make rzeczy czystsze. Połamałem kroki w oddzielnych liniach, aby ułatwić dokumentację. – ghoti