テストの目的で、一意の単語(厳密には繰り返さない)を含める必要がある非常に大きなサイズのファイルを作成します。 GB、TBなどで指定できます。端末でこれを行うことはできますか?
buntu 16.04 (Xenial Xerus)を使用しています。
以下のスクリプトは、アルファベットの文字から保証された一意の単語を生成します。固定長の文字の問題は、limitedの可能性のセットを生成し、ファイルのサイズを制限することです。
したがって、python
のpermutations
を使用しました。これにより、(有限の)一意の単語が生成されます。 ただしすべての組み合わせを使用した後、最初からやり直し、単語2、3、4、n
回などを印刷します。n
のすべての値は新しいものを作成しますユニークな言葉。したがって、100%確かに一意の単語を生成するジェネレーターがあります。
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
として保存します次のコマンドで実行します:
python3 /path/to/unique_generator.py > /path/to/bigfile.txt
スクリプトは、さまざまな長さの一意の単語を生成します。必要に応じて、行を変更することにより、開始または最大長を設定できます。
for n in range(1, len(ab)+1)
(範囲の開始を置き換えます)、および変更:
while True:
into(例えば):
while t < 10:
最後のケースでは、単語の長さはアルファベットの最大10倍です。
そうでなければ:
kill $(pgrep -f /path/to/unique_generator.py)
仕事をする必要があります。
文字のランダムな行を作成する最も簡単なワンライナー:
while true; do echo $RANDOM | base64 >> BIGFILE.txt ; done
または、代わりに:
while true; do echo $RANDOM | sha512sum >> BIGFILE.txt ; done
一意性を高めるには、/dev/urandom
を使用できます。
cat /dev/urandom | base64
ファイルが目的のサイズに達したら、Ctrl + Cでコマンドを終了します
ランダム文字列/パスワードジェネレータ も考慮してください:
したがって、そこの答えの1つは、これを持つように適応させることができます:
while true; do openssl Rand -base64 20 ; done
句読点や数字を使用したくないが、文字のみを使用する場合は、tr
を使用して修正できます。
while true; do openssl Rand -base64 20 | tr -d '[[:digit:]][[:punct:]]' ; done
ランダム性を高めるには、shuf
を使用して、生成された文字列の文字をシャッフルできます。
while true; do openssl Rand -base64 20 | fold -w1 | shuf | tr -d '\n' ; done
などなど。出力をbase64
またはsha256sum
コマンドの別のセットに渡して、さらにランダムにすることもできます。
シェル以外の代替言語が好きな人のために、ここにpythonワンライナーがあります:
python -c $'import string,random;i = [i for i in string.uppercase + string.lowercase + string.digits];\nwhile not random.shuffle(i): print "".join(i)'
ランダムな単語でいっぱいの大きなファイルを取得するには、次のコマンドを使用します。
cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq
これにより、各行に一意のWordとランダムテキストの文字列を含むファイルが作成されます。 1000を大きくまたは小さくすることで、ファイルのサイズを大きくすることができます。各カウントは約1バイトに相当します。
単語をスペースで区切るには、単にtr "\n" " "
を介してそれらを返します。
cat /dev/urandom | head -c 1000000 | tr -dc "A-Za-z0-9\n" | sort | uniq | tr "\n" " "
これにより、シェルのループに関連するパフォーマンスの問題も回避されます。
Linuxで/proc/sys/kernel/random/uuid
を使用して IDs を生成することもできます。これは一意であることが保証されている必要があります。
[~]$ 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
-tr -d
の文字を削除してから、これをファイルにリダイレクトできます。
[~]$ for i in {1..10000}; do cat /proc/sys/kernel/random/uuid | tr -d '-' ; done > /tmp/words
[~]$ sort /tmp/words | uniq | wc -l
10000
限られたアルファベットと非常に予測可能な出力が問題ない場合、おそらく次の答えが最も速い(そして最もゴルフが多い:P)答えです:
seq 100
(単語が数字だけで構成されている場合)、または:
seq 100 | tr 0-9 A-I
(実際の文字を使用したい場合)。