2つの並列テキストファイルを混在させる

2つの並列テキストファイルを混在させる

私は約5000万の単語で構成されている2つの文の並べ替え並列パッチ(テキストファイル)を持っています。 (Europarlコーパスから - >法律文書の並列翻訳)。今、私は2つのファイルの行を混ぜたいのですが、同じ方法です。私はgshuf(私はMacを使っています)を使って独自のランダム性ソースを使ってこの問題を解決したいと思います。

gshuf --random-source /path/to/some/random/data file1
gshuf --random-source /path/to/some/random/data file2

end of fileただし、明らかにランダムシードには、ソート中のファイルに含まれるすべての単語を含める必要があるため、エラーが発生します。本当に?それでは、私のニーズに合ったランダムシードをどのように生成する必要がありますか?それ以外の場合、ファイルを並列にランダム化する他の方法は何ですか?一緒に貼り付けてランダムに抽出し、再分割する方法を考えました。ただし、ファイルに表示されない区切り文字を最初に見つける必要があるため、これは見苦しく見えます。

ベストアンサー1

よりエレガントな方法があるかどうかはわかりませんが、これは私にとって効果的です。

mkfifo onerandom tworandom threerandom
tee onerandom tworandom threerandom < /dev/urandom > /dev/null &
shuf --random-source=onerandom onefile > onefile.shuf &
shuf --random-source=tworandom twofile > twofile.shuf &
shuf --random-source=threerandom threefile > threefile.shuf &
wait

結果:

$ head -n 3 *.shuf
==> onefile.shuf <==
24532 one
47259 one
58678 one

==> threefile.shuf <==
24532 three
47259 three
58678 three

==> twofile.shuf <==
24532 two
47259 two
58678 two

ただし、ファイルの行数はまったく同じでなければなりません。


GNU Coreutilsのドキュメントでは、openssl繰り返しランダム性を達成するためにシードランダムジェネレータを使用するための優れたソリューションも提供しています。

https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html#Random-sources

get_seeded_random()
{
  seed="$1"
  openssl enc -aes-256-ctr -pass pass:"$seed" -nosalt \
    </dev/zero 2>/dev/null
}

shuf -i1-100 --random-source=<(get_seeded_random 42)

しかし、他の人が「あなたの」ランダムな結果を再現できるようにしたくない限り、「42」よりも良いシードを使用することを検討してください。

おすすめ記事