Dans un script de Bash, je veux extraire N lignes aléatoires du fichier d'entrée et les sortir dans un autre fichier.
Comment cela peut-il être fait ?
Dans un script de Bash, je veux extraire N lignes aléatoires du fichier d'entrée et les sortir dans un autre fichier.
Comment cela peut-il être fait ?
# Function to sample N lines randomly from a file
# Parameter $1: Name of the original file
# Parameter $2: N lines to be sampled
rand_line_sampler() {
N_t=$(awk '{print $1}' $1 | wc -l) # Number of total lines
N_t_m_d=$(( $N_t - $2 - 1 )) # Number oftotal lines minus desired number of lines
N_d_m_1=$(( $2 - 1)) # Number of desired lines minus 1
# vector to have the 0 (fail) with size of N_t_m_d
echo '0' > vector_0.temp
for i in $(seq 1 1 $N_t_m_d); do
echo "0" >> vector_0.temp
done
# vector to have the 1 (success) with size of desired number of lines
echo '1' > vector_1.temp
for i in $(seq 1 1 $N_d_m_1); do
echo "1" >> vector_1.temp
done
cat vector_1.temp vector_0.temp | shuf > rand_vector.temp
paste -d" " rand_vector.temp $1 |
awk '$1 != 0 {$1=""; print}' |
sed 's/^ *//' > sampled_file.txt # file with the sampled lines
rm vector_0.temp vector_1.temp rand_vector.temp
}
rand_line_sampler "parameter_1" "parameter_2"
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.
0 votes
Triez le fichier au hasard et choisissez les N premières lignes.
1 votes
Voir aussi stackoverflow.com/questions/12354659/ .
35 votes
Ce n'est pas un doublon -- il veut N lignes contre 1 ligne.
2 votes
Liés : Choisir au hasard des lignes d'un fichier sans l'aspirer avec Unix
2 votes
Je ne suis pas d'accord avec
sort -R
car il fait beaucoup de travail en trop, en particulier pour les fichiers longs. Vous pouvez utiliser$RANDOM
,% wc -l
,jot
,sed -n
(à la stackoverflow.com/a/6022431/563329 ), et des fonctionnalités bash (tableaux, redirections de commandes, etc.) pour définir votre proprepeek
qui s'exécutera réellement sur des fichiers de 5 000 000 de lignes.