J'ai des fichiers sous Linux. Par exemple, 2 et j'ai besoin de mélanger les fichiers dans un fichier.
Par exemple
$cat file1
line 1
line 2
line 3
line 4
line 5
line 6
line 7
line 8
et
$cat file2
linea one
linea two
linea three
linea four
linea five
linea six
linea seven
linea eight
Et plus tard, en mélangeant les deux fichiers, je peux obtenir quelque chose comme:
linea eight
line 4
linea five
line 1
linea three
line 8
linea seven
line 5
linea two
linea one
line 2
linea four
line 7
linea six
line 1
line 6
Vous devriez utiliser shuf
command =)
cat file1 file2 | shuf
Ou avec Perl:
cat file1 file2 | Perl -MList::Util=shuffle -wne 'print shuffle <>;'
Trier:
cat file1 file2 | sort -R
Shuf:
cat file1 file2 | shuf
Perl:
cat file1 file2 | Perl -MList::Util=shuffle -e 'print shuffle<STDIN>'
FRAPPER:
cat file1 file2 | while IFS= read -r line
do
printf "%06d %s\n" $RANDOM "$line"
done | sort -n | cut -c8-
Awk:
cat file1 file2 | awk 'BEGIN{srand()}{printf "%06d %s\n", Rand()*1000000, $0;}' | sort -n | cut -c8-
Juste une note pour les utilisateurs de Mac OS X: la commande shuf
fait partie de coreutils
et est installée sous le nom gshuf
.
$ Sudo port install coreutils
$ gshuf example.txt # or cat example.txt | gshuf
Voici une ligne qui ne repose pas sur shuf
ou sort -R
, que je n'avais pas sur mon mac:
while read line; do echo $RANDOM $line; done < my_file | sort -n | cut -f2- -d' '
Cela parcourt toutes les lignes dans my_file
et les réimprime dans un ordre aléatoire.
J'utiliserais aussi shuf
.
une autre option, sorte de gnou a:
-R, --random-sort
sort by random hash of keys
tu pourrais essayer:
cat file1 file2|sort -R
Vous n'avez pas besoin d'utiliser des tuyaux ici. Tri seul fait ceci avec le (s) fichier (s) en tant que paramètres. Je voudrais juste faire
sort -R file1
ou si vous avez plusieurs fichiers
sort -R file1 file2
Cela a fonctionné pour moi. Il utilise le shuffle Fisher-Yates.
randomize()
{
arguments=("$@")
declare -a out
i="$#"
j="0"
while [[ $i -ge "0" ]] ; do
which=$(random_range "0" "$i")
out[j]=${arguments[$which]}
arguments[!which]=${arguments[i]}
(( i-- ))
(( j++ ))
done
echo ${out[*]}
}
random_range()
{
low=$1
range=$(($2 - $1))
if [[ range -ne 0 ]]; then
echo $(($low+$RANDOM % $range))
else
echo "$1"
fi
}
Il est clairement biaisé Rand (comme la moitié du temps, la liste commencera par la première ligne), mais pour une randomisation de base avec juste une construction bash, je suppose que ça va? Il suffit d’imprimer chaque ligne oui/non, puis d’imprimer le reste ...
shuffle() {
local IFS=$'\n' tail=
while read l; do
if [ $((RANDOM%2)) = 1 ]; then
echo "$l"
else
tail="${tail}\n${l}"
fi
done < $1
printf "${tail}\n"
}