381 Stimmen

Zufällige Zeilen aus einer Datei auswählen

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?

0voto

Sixtyfive Punkte 919

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."

-1voto

andrec Punkte 111
# 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"

-2voto

user19322235 Punkte 1

Im Folgenden steht 'c' für die Anzahl der Zeilen, die aus der Eingabe ausgewählt werden sollen. Ändern Sie nach Bedarf:

#!/bin/sh

gawk '
BEGIN   { srand(); c = 5 }
c/NR >= rand() { lines[x++ % c] = $0 }
END { for (i in lines)  print lines[i] }

' "$@"

CodeJaeger.com

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.

Powered by:

X