マルチラインファイルランダム再生

マルチラインファイルランダム再生

テキストブロックを区切る空白行のテキストファイルがあります。 * NIXコマンドラインツールを使用してブロック構造を尊重しながら、このファイルを混在させたいと思います。つまり、出力でブロックの順序が変更されていることを確認し、ブロック内の行とその順序が同じであることを確認したいと思います。

入力ファイルの例:

line 1
line 2

line 10
line 20
line 30

line 100
line 200

出力ファイル(シャフリング後):

line 10
line 20
line 30

line 1
line 2

line 100
line 200

もちろん、繰り返し実行は異なるブロック順序を提供する必要があります。

ファイルの最初の行は常に空ではありません。二重空行はありません。ファイルの最後の行は常に空です。

私はリストリストのすべての行を読み、それを混ぜて出力する非常に単純なPythonスクリプトを書いています。標準* NIXツールを使用してこれを実行できるかどうか疑問に思います。

ベストアンサー1

POSIXlyでは、次のことができます。

<file awk '
  BEGIN{srand(); n=rand()}
  {print n, NR, $0}
  !NF {n=rand()}
  END {if (NF) print n, NR+1, ""}' |
  sort -nk1 -k2 |
  cut -d' ' -f3-

つまり、各行の前に<a-random-number-that-changes-with-each-paragraph>行番号を追加し、最初の番号を数字で並べ替え、2番目の番号を並べ替えて段落の行順を維持し、関連性のない番号を削除します。

末尾の空白行を削除するにはパイプが必要な場合がありますsed '$d'

ほとんどのawk実装では、 srand()Unixのエポック時間を使用して擬似乱数ジェネレータをシードするため、同じ秒以内に2回実行すると同じ結果が得られます。残念ながら私の努力にもかかわらず、POSIX仕様に歴史的なエラーが刻まれています。)。

おすすめ記事