Erstellen einer großen Datei mit dem Terminal

7

Ich möchte zu Testzwecken eine sehr große Datei erstellen, die eindeutige Wörter enthalten sollte (streng genommen nicht wiederholt). Es kann in GB, TB usw. Kann ich dies mit dem Terminal tun?

Ich benutze Ubuntu 16.04 (Xenial Xerus).

Avani Badheka
quelle
Kommentare sind nicht für eine ausführliche Diskussion gedacht. Das Gespräch, das hier stattfand, wurde in den Chat verschoben .
Thomas Ward
Definieren Sie, was Sie mit Wort meinen? Ein englisches Wort? Oder ist 'k345j # _' auch ein Wort für Sie?
Grzegorz Oledzki

Antworten:

12

Erstellen einer unendlichen Anzahl von Wörtern, garantiert einzigartig

Das folgende Skript generiert garantiert eindeutige Wörter aus Zeichen aus dem Alphabet. Das Problem bei jeder festen Länge von Zeichen besteht darin, dass nur begrenzte Möglichkeiten zur Verfügung stehen und die Größe Ihrer Datei begrenzt wird.

Ich habe daher python's verwendet permutations, das eine (endliche) Anzahl eindeutiger Wörter erzeugt. Nachdem wir jedoch alle Kombinationen verwendet haben, beginnen wir einfach von vorne und drucken die Wörter 2, dann 3, 4, nmal usw., wobei jeder Wert für nein neues eindeutiges Wort erzeugt. Somit haben wir einen Generator, um 100% sicher eindeutige Wörter zu produzieren.

Das Skript:

import itertools
import string

ab = [c for c in string.ascii_lowercase]

t = 1
while True:   
    for n in range(1, len(ab)+1): 
        words = itertools.permutations(ab, n)
        for word in words:
            print(t*("".join(word)))
    t += 1

Wie benutzt man

  • Kopieren Sie das Skript einfach in eine leere Datei und speichern Sie es unter unique_generator.py
  • Führen Sie es mit dem folgenden Befehl aus:

    python3 /path/to/unique_generator.py > /path/to/bigfile.txt
    

Hinweis

Das Skript erzeugt einzigartige Wörter unterschiedlicher Länge. Wenn Sie möchten, können Sie die Start- oder Maximallänge einstellen, indem Sie die Zeilen ändern:

for n in range(1, len(ab)+1)

(Ersetzen Sie den Anfang des Bereichs) und ändern Sie:

while True:  

in (zum Beispiel):

while t < 10:   

Im letzten Fall beträgt die Länge der Wörter maximal das 10-fache des Alphabets.

Prozess beenden

  • Wenn Sie es vom Terminal aus ausführen, drücken Sie einfach Ctrl+C
  • Andernfalls:

    kill $(pgrep -f /path/to/unique_generator.py)
    

    sollte den Job machen.

Jacob Vlijm
quelle
Sehr schön ! Ich habe einmal Permutationen verwendet. Ein ziemlich nützliches Werkzeug
Sergiy Kolodyazhnyy
@Serg Ich liebe itertools :) Die Schleife ist übrigens hartnäckig und versucht immer noch ... Berechtigungen sind in Ordnung.
Jacob Vlijm
während Sie den Befehl "python3 /path/to/unique_generator.py> /path/to/bigfile.txt" ausführen, wie Sie ihn stoppen, wenn wir nicht weiter wollen.
Avani Badheka
@JacobVlijm: Danke für deine freundliche Anstrengung. Wie stoppe ich den Befehl "python3 /path/to/unique_generator.py> /path/to/bigfile.txt", wenn wir die gewünschte Größe erreicht haben?
Avani Badheka
Hallo, @Avanibadheka hat meine Antwort so bearbeitet, dass der Prozess gestoppt wird.
Jacob Vlijm
6

Verwenden Sie den folgenden Befehl, um eine große Datei mit zufälligen Wörtern zu erhalten:

cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq

Dadurch wird eine Datei mit einem eindeutigen Wort in jeder Zeile und zufälligen Textzeichenfolgen erstellt. Sie können die Größe der Datei erhöhen, indem Sie 1000 größer oder kleiner machen. Jede Zählung entspricht ungefähr einem Byte.

Um die Wörter durch Leerzeichen zu trennen, geben Sie sie einfach wieder durch tr "\n" " ".

cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq | tr "\n" " "

Dies vermeidet auch die Leistungsprobleme, die mit Schleifen auf der Shell verbunden sind.

DonyorM
quelle
Was sind die Leistungsprobleme mit Schleifen auf der Shell ? Ich hoffe, dass dies nicht vom Thema
abweicht
2
@CiprianTomoiaga: kurze Antwort: Das Laichen neuer Prozesse ist teuer. Schleifen wie in Sergs Antwort tun dies in jeder Iteration, möglicherweise mehrmals. Diese Antwort verwendet dieselben Prozesse, um alle Arbeiten auszuführen. Für eine längere Antwort senden Sie bitte eine Site-Frage ;-)
Liori
6

Einfachster Einzeiler zum Erstellen zufälliger Zeichenzeilen:

while true; do echo $RANDOM | base64 >> BIGFILE.txt  ; done

oder alternativ:

while true; do echo $RANDOM | sha512sum  >> BIGFILE.txt ; done   

Für eine bessere Einzigartigkeit können Sie Folgendes verwenden /dev/urandom:

cat /dev/urandom | base64 

Beenden Sie den Befehl mit Strg + C, wenn Ihre Datei die gewünschte Größe erreicht hat

Berücksichtigen Sie auch zufällige Zeichenfolgen- / Kennwortgeneratoren :

Somit kann eine der Antworten dort angepasst werden, um dies zu haben:

while true; do openssl rand -base64 20 ; done

Wenn Sie keine Satzzeichen und Zahlen verwenden möchten, sondern nur Buchstaben, können wir Folgendes trkorrigieren:

while true; do openssl rand -base64 20 | tr -d '[[:digit:]][[:punct:]]'  ; done 

Für zusätzliche Zufälligkeit können Sie die Zeichen der generierten Zeichenfolgen mit mischen shuf.

while true; do openssl rand -base64 20 | fold -w1 | shuf | tr -d '\n' ; done

Und so weiter und so fort. Sie können die Ausgabe sogar an einen anderen Satz von base64oder sha256sumBefehle übergeben, um sie noch zufälliger zu gestalten.

Für diejenigen, die andere alternative Sprachen als Shell mögen, gibt es hier einen Python-Einzeiler:

python -c $'import string,random;i = [i for i in string.uppercase + string.lowercase + string.digits];\nwhile not random.shuffle(i): print "".join(i)'
Sergiy Kolodyazhnyy
quelle
Ja, es kann zu Problemen führen. Es kann zufällig sein, also keine Garantie für eindeutige Wörter.
Avani Badheka
Ich habe die Eindeutigkeitsprobleme bereits aus verschiedenen Blickwinkeln angesprochen, Leute, also überlegen Sie, die Kommentare zu entfernen
Sergiy Kolodyazhnyy
1
Technisch ist es immer noch möglich, dass etwas nicht einzigartig ist, aber es ist ziemlich unwahrscheinlich
DonyorM
1
@DonyorM Wenn Sie auf das Beispiel mit $RANDOMVariable zeigen, dann ja, aber die /dev/urandomzufällige Wahrscheinlichkeit ist ziemlich gering, insbesondere in Kombination mit Shasum.
Sergiy Kolodyazhnyy
"ziemlich gering in zufälliger Wahrscheinlichkeit". . . em, mein schlafentzogenes Gehirn bedeutet, dass die Wahrscheinlichkeit gering ist, dass nicht eindeutige Daten generiert werden. Aber Sie bekommen die Idee
Sergiy Kolodyazhnyy
3

Wenn ein begrenztes Alphabet und eine sehr vorhersehbare Ausgabe in Ordnung sind, ist die folgende wahrscheinlich die schnellste (und am meisten Golf: P) Antwort:

seq 100

(wenn Wörter nur aus Zahlen bestehen dürfen) oder:

seq 100 | tr 0-9 A-I

(wenn der Wunsch besteht, tatsächliche Buchstaben zu verwenden).

liori
quelle
3

Sie können auch unter /proc/sys/kernel/random/uuidLinux UUIDs generieren , die garantiert eindeutig sein sollten:

[~]$ for i in {1..10}; do cat /proc/sys/kernel/random/uuid; done
c8072c40-32f5-4f14-8794-c3ab68e1a0f5
2f2630d8-0e17-4cba-8e62-586ee23f0ebb
97606886-f227-46f6-827a-141b0db57c59
5ffea57c-c3bf-4ba6-8c08-8a1b29ee8f6c
2b90f797-2def-4433-ae71-6f404db944fc
fcb793e9-6102-472d-a7a0-7bf5204dbee5
d84e2877-6804-4bed-85f0-0a551234425a
3d9445ca-335c-4960-83d5-6cb1bef8b9eb
913bce71-5c20-47f7-a22e-277be6856a57
8f232541-f8c1-46ba-b57a-0d11314c3483

Sie können - Zeichen mit entfernen tr -dund dann in eine Datei umleiten:

[~]$ for i in {1..10000}; do cat /proc/sys/kernel/random/uuid | tr -d '-' ; done > /tmp/words
[~]$ sort /tmp/words | uniq | wc -l
10000
Nykakin
quelle