GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Zeichnen Sie zufällig eine bestimmte Anzahl von Linien aus einer Datendatei

Das ist vielleicht nicht der effizienteste Weg, aber es funktioniert:

shuf <file> > tmp
head -n $m tmp > out1
tail -n +$(( m + 1 )) tmp > out2

Mit $m enthält die Anzahl der Zeilen.


Dieses bash/awk-Skript wählt zufällig Zeilen aus und behält die ursprüngliche Reihenfolge in beiden Ausgabedateien bei.

awk -v m=4 -v N=$(wc -l <file) -v out1=/tmp/out1 -v out2=/tmp/out2 \
 'BEGIN{ srand()
         do{ lnb = 1 + int(rand()*N)
             if ( !(lnb in R) ) {
                 R[lnb] = 1
                 ct++ }
         } while (ct<m)
  } { if (R[NR]==1) print > out1 
      else          print > out2       
  }' file
cat /tmp/out1
echo ========
cat /tmp/out2

Ausgabe, basierend auf den Daten in der Frage.

12345
23456
200
600
========
67891
-20000
20

Wie bei allen Unix-Dingen gibt es dafür ein Dienstprogramm.

Tagesprogramm:split
split teilt eine Datei auf viele verschiedene Arten, -b Bytes, -l Zeilen, -n Anzahl der Ausgabedateien. Wir werden den -l verwenden Möglichkeit. Da Sie zufällige Zeilen auswählen möchten und nicht nur die erste m , werden wir sort die Datei zufällig zuerst. Wenn Sie über sort lesen möchten , siehe meine Antwort hier.

Nun der eigentliche Code. Es ist wirklich ganz einfach:

sort -R input_file | split -l $m output_prefix

Dadurch werden zwei Dateien erstellt, eine mit m Zeilen und eine mit N-m Zeilen mit dem Namen output_prefixaa und output_prefixab .Stellen Sie sicher, dass m ist die gewünschte größere Datei oder Sie erhalten mehrere Dateien der Länge m (und eine mit N % m ).

Wenn Sie sicherstellen möchten, dass Sie die richtige Größe verwenden, finden Sie hier einen kleinen Code dafür:

m=10 # size you want one file to be
N=$(wc -l input_file)
m=$(( m > N/2 ? m : N - m ))
sort -R input_file | split -l $m output_prefix

Bearbeiten:Mir ist aufgefallen, dass einige sort Implementierungen haben keinen -R Flagge. Wenn Sie perl haben , können Sie perl -e 'use List::Util qw/shuffle/; print shuffle <>;' ersetzen .


Linux
  1. Ermitteln Sie die Anzahl der Codezeilen aus dem GitHub-Repository

  2. Datei nach Anzahl der Zeilen aufteilen, einschließlich Header in jeder Zeile?

  3. Anzahl der von Ls ausgegebenen Zeilen?

  4. Wie füllt man eine Datei mit einem Stream aus /dev/urandom mit einer bestimmten Anzahl von Zeilen?

  5. Awk aus verschiedenen Linien?

So entfernen Sie Zeilen aus einer Datei mit dem Sed-Befehl

5 Möglichkeiten, die Anzahl der Zeilen in einer Datei zu zählen

Auflisten von Zeilen aus nur einer Datei in DIFF

Entfernt eine bestimmte Zeile aus der Bash-Verlaufsdatei

Linux - grep von bestimmten Zeilen bis zum Ende der Datei

Zeilen von unten extrahieren, bis Regex übereinstimmt