テキスト処理速度の向上

テキスト処理速度の向上

一部のデータを含むファイルを処理する次のスクリプトがあります。まず、ヘッダーを出力ファイルに印刷します。次に、入力からランダムに60000行を選択して出力に印刷します(同じ行を複数回印刷する可能性は明らかに欲しい)。

N = 60000
gawk '{if (NR < 37) print $0}' input > output
MAX=$(gawk 'END{print NR}' input)

for ((i=1; i<=$N; i++ ))
do

   declare $(gawk -v min=37 -v max=$MAX -v seed=$RANDOM 'BEGIN{srand(seed); print "x="int(min+rand()*(max-min+1))}')
   gawk -v l=$x 'NR>36 && NR==l {print $0}' input >> output

done

私はこれが非常に非効率的だと思うので、このコードのパフォーマンスを向上させる方法についてのアイデアを開こうとしています。入力ファイルを常に開閉するのを停止することも可能です。

時間をいただきありがとうございます!

ベストアンサー1

まず、名前付きファイルから36行のヘッダーを抽出し、ファイルの残りinputの部分で60000行をランダムに選択し、同じ行を複数回ランダムに選択できます。すべての出力はoutput

shufGNU coreutilsの使用:

#!/bin/sh

# Fetch header (36 first lines)
head -n 36 <input >output

# Scramble the other lines and pick 60000 (allowing for repeated lines)
tail -n +37 <input | shuf -r -n 60000 >>output

または:

( head -n 36 <input; tail -n +37 <input | shuf -r -n 60000 ) >output

GNU を使用すると、head出力の最後の行の直後に入力ファイルストリームが保持されます。言い換えれば、読み取りが終了した場所から続行shufできます(この機能は機能しない可能性があります)。head一部非GNUhead実装):

( head -n 36; shuf -r -n 60000 ) <input >output

おすすめ記事