一部のデータを含むファイルを処理する次のスクリプトがあります。まず、ヘッダーを出力ファイルに印刷します。次に、入力からランダムに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
。
shuf
GNU 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