web-dev-qa-db-ja.com

特定の範囲からテキストファイルのランダムな行を削除するにはどうすればよいですか?

テキストファイルがあり、範囲からランダムな行を削除したい。以下に例を示します。

Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz

これら6つのうち、3つをランダムに削除します。

それをどうやってやるの? vimに解決策があれば素晴らしいので、さまざまな範囲に適用できます。

5
deshmukh

sedを使用したソリューションは次のとおりです。

sed -i $((開始 +ランダム% 範囲))d filename.txt

どこ:

  • startは、範囲の開始行番号です
  • 範囲(またはend-startは含める行数start
  • sed -i -Ndは、入力ファイルの行Nを削除するようにsedに指示します
  • RANDOMはbashの乱数ジェネレーターです。使用時に0〜32767のランダムな整数を保持する特別なシェル変数。

したがって、たとえば、ファイルtest.txtの行90と120の間のランダムな行を削除するには、次のようにします。

sed -i $((90 +ランダム% 30))d test.txt
7
ish

テキストファイルの特定の範囲から複数のランダムな行を削除するために、次のようにしました。

  • Vimでファイルを開きます
  • 複数のランダムな行を削除する範囲の先頭に移動します。範囲の下部に空の行が必要です
  • 次のコマンドを入力します。

    .,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
    

。 - ここから

、/ ^\s * $ /-1-最後の非空白行まで

!sed -e $((9 * $ RANDOM/32267))d-ランダムな行を削除するsedコマンド

これにより、1行がランダムに削除されます。

ランダムな行をさらに5行削除したい場合は、5 @:を実行するだけで、残りはvimが実行します。

9(削除する行の数)を普遍的な式で置き換えることができれば、これはさらに改善できます。

1
deshmukh

pythonでも可能です:

bash-4.3$ python -c 'import sys,random;lines=sys.stdin.readlines();lines.pop(random.randint(0,len(lines)-1));print "".join(lines)' < input.txt
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 5: qrst
Line 6: uvwxyz

ここでのプロセスは簡単です。入力ファイルをpythonのstdinにリダイレクトし、すべての行をリストに読み込みます。次に、インデックス0から最後のインデックスまで、リスト内のすべてのインデックスの範囲内でrandom.randint()関数を使用してランダムな行インデックスを選択します(これがlen(lines)-1の機能です)。そのインデックスはlines.pop()を介してリストから削除され、再構築されたテキストを印刷します。とてもシンプル

0

次のコマンドを使用します

:nd

ここで、nは行番号です。

0
James