テキストファイルがあり、範囲からランダムな行を削除したい。以下に例を示します。
Line 1: abcd
Line 2: efgh
Line 3: ijkl
Line 4: mnop
Line 5: qrst
Line 6: uvwxyz
これら6つのうち、3つをランダムに削除します。
それをどうやってやるの? vimに解決策があれば素晴らしいので、さまざまな範囲に適用できます。
sed
を使用したソリューションは次のとおりです。
sed -i $((開始 +ランダム% 範囲))d filename.txt
どこ:
sed -i -Nd
は、入力ファイルの行Nを削除するようにsedに指示しますRANDOM
はbashの乱数ジェネレーターです。使用時に0〜32767のランダムな整数を保持する特別なシェル変数。したがって、たとえば、ファイルtest.txtの行90と120の間のランダムな行を削除するには、次のようにします。
sed -i $((90 +ランダム% 30))d test.txt
テキストファイルの特定の範囲から複数のランダムな行を削除するために、次のようにしました。
次のコマンドを入力します。
.,/^\s*$/-1 !sed -e $((9 * $RANDOM / 32267))d
。 - ここから
、/ ^\s * $ /-1-最後の非空白行まで
!sed -e $((9 * $ RANDOM/32267))d-ランダムな行を削除するsedコマンド
これにより、1行がランダムに削除されます。
ランダムな行をさらに5行削除したい場合は、5 @:を実行するだけで、残りはvimが実行します。
9(削除する行の数)を普遍的な式で置き換えることができれば、これはさらに改善できます。
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()
を介してリストから削除され、再構築されたテキストを印刷します。とてもシンプル
次のコマンドを使用します
:nd
ここで、nは行番号です。