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).
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).
Antworten:
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, n
mal usw., wobei jeder Wert für n
ein neues eindeutiges Wort erzeugt. Somit haben wir einen Generator, um 100% sicher eindeutige Wörter zu produzieren.
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
unique_generator.py
Führen Sie es mit dem folgenden Befehl aus:
python3 /path/to/unique_generator.py > /path/to/bigfile.txt
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.
Andernfalls:
kill $(pgrep -f /path/to/unique_generator.py)
sollte den Job machen.
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.
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 tr
korrigieren:
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 base64
oder sha256sum
Befehle ü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)'
$RANDOM
Variable zeigen, dann ja, aber die /dev/urandom
zufällige Wahrscheinlichkeit ist ziemlich gering, insbesondere in Kombination mit Shasum.
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).
Sie können auch unter /proc/sys/kernel/random/uuid
Linux 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 -d
und 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