In einem Bash-Skript möchte ich N zufällige Zeilen aus einer Eingabedatei heraussuchen und in eine andere Datei ausgeben.
Wie lässt sich das bewerkstelligen?
In einem Bash-Skript möchte ich N zufällige Zeilen aus einer Eingabedatei heraussuchen und in eine andere Datei ausgeben.
Wie lässt sich das bewerkstelligen?
Nur der Vollständigkeit halber und weil es in den Arch-Community-Repos verfügbar ist: Es gibt auch ein Tool namens shuffle
aber es hat keine Befehlszeilenschalter, um die Anzahl der Zeilen zu begrenzen, und warnt in seiner Manpage: "Da shuffle die Eingabe in den Speicher liest, kann es bei sehr großen Dateien fehlschlagen."
# 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"
CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.