2016-05-18 15 views
1

Ich möchte nach dem Zufallsprinzip einen Bruchteil (sagen 0,001) aller Zeilen durch stdin beibehalten. Gibt es einen Linux-Befehl, der das tut?Linux-Befehl zum Subsampling von stdin

Ich kann immer ein Python-Skript schreiben, um eine einheitliche Zufallszahl zu erzeugen und basierend darauf, ob es < = 0.001 ist, behalten Sie die Linie. Aber ich möchte vermeiden, mein eigenes Skript zu schreiben und suchte nach einem nativen Befehl in Linux.

+0

Ich fürchte, Sie müssen Ihre eigenen schreiben ... –

+0

Wirklich? Dies scheint ein Fall zu sein, der nützlich genug ist, um einen nativen Linux-Befehl zu rechtfertigen. Selbst ein unangenehmer Ausdruck mit awk/sed/etc würde ausreichen. – Nik

+0

Sie haben recht, vielleicht kann 'shuf' von coreutils den Trick machen. Es kann die Zeilen mischen und Sie können höchstens "n" Einträge anfordern ... –

Antwort

4

Ist es nativ genug?

cat input | awk 'rand() <= 0.001' 

EDIT: Um es anderen Satz von Linien pro Sekunde zu machen zurück:

cat input | awk 'BEGIN{srand();} rand() <= 0.001' 
+0

Das ist, was ich gesucht habe. – Nik

+0

Wie mache ich es zufällig? Verschiedene Läufe geben mir die gleichen Linien. – Nik

+1

Sie müssen den Zufallszahlengenerator initialisieren. Siehe meine Bearbeitung. – gudok

1

Die meisten Linux-Distributionen enthalten auch eine Verteilung der BSD games (Paket bsdgames auf Debian-basierten Distributionen und bsd-games auf redhat basierte Distributionen). Mit diesem Paket installiert haben, können Sie einfach das random Filter, das ist genau das tut, was Sie wollen:

cat input | random 100 

wird jede 100. Zeile im Durchschnitt drucken.

+0

Das wäre perfekt gewesen, wenn * alle * Linux-Distributionen diesen Befehl hätten . Daher nicht als die akzeptierte Antwort zu markieren, aber danke dafür, dies zu bemerken. – Nik