ソースファイルの順序を尊重し、任意の行を印刷します。

ソースファイルの順序を尊重し、任意の行を印刷します。

短い文章(数語の長さ)を含む大きなテキストファイル(〜500,000行)があります。また、ほとんどの行にはいくつかのXMLタグがあります。最後に、テキストファイルがソートされます。今後タグが追加されました! XMLタグを追加するとアルファベット順が変わりますが、これは必須です。

私の質問は次のとおりですソースファイル順にランダムな行を印刷する方法は?

shufコマンドを使用して結果を並べ替えることができます。問題は、タグがソートを混乱させることです。

またpython、テキストファイルをリストにロードし、任意の数値を生成し、それらをソートし、行を取得するインデックスとして使用するスクリプトを作成することもできます。可能であれば、標準の*nixコマンドラインツールを好みます。

サンプル:

<CITY>anaconda</CITY> city is in <STATE>montana</STATE>
let's go to <CITY>rome</CITY>
please find <CITY>berlin</CITY>
where is <CITY>cairo</CITY> in <COUNTRY>egypt</COUNTRY>

2号線と3号線を抜くことができれば本当にいいと思います。 1,3,4号線も良いです。行3、1、4を得ると、それは良くありません。

答え1

これを使用してください:

nl file | shuf -n2 | sort -n | cut -f2-
  • nl行に番号を付け、
  • shuf順序を混ぜて出力を2行に制限します(-n)。
  • sort元の順序を復元し、
  • cutcountを削除しますnl

ファイルの2行を元の順序で印刷します。を使用してくださいshuf -n XX任意の数字にすることができます。

答え2

Donald E. KnuthのThe Art of Computerプログラミング、第2巻、セクション3.4.2では、並べ替えずに(行が何個あるのか分からないまま)、ファイルからランダムな行を選択する方法について説明します。これは実装が簡単です。たとえば、次のようになります。

(echo foo; echo bar; echo zot) \
| perl -nle 'rand $. < 1 && ( $line = $_ ); END { print $line }'

shufまたは、Knuthアルゴリズムを選択するよりも多くのメモリが必要な場合がありますが、特定の行数を選択できることを試してください。

答え3

次のように、whileループと$ RANDOMを使用してこれを実行できます。

while read line; do
    if ((RANDOM%2)); then
        echo $line;
    fi;
done < _path_

これにより、行の半分程度が印刷されます。条件でコントロールを使用できます。if

関連情報