2016-07-16 9 views
1

テキストファイルを配列に読み込み、要素を抽出してソートするのに非常に時間がかかります。配列から文字列をソートするのに長い時間がかかります

テキストファイルは、R128オーディオ分析用のffmpegコンソール出力です。最高のM値とS値を取得する必要があります。例:

[Parsed_ebur128_0 @ 0x7fd32a60caa0] t: 4.49998 M: -22.2 S: -29.9  I: -27.0 LUFS  LRA: 9.8 LU FTPK: -12.4 dBFS TPK: -9.7 dBFS 
[Parsed_ebur128_0 @ 0x7fd32a60caa0] t: 4.69998 M: -22.5 S: -28.6  I: -25.9 LUFS  LRA: 11.3 LU FTPK: -12.7 dBFS TPK: -9.7 dBFS 

テキストファイルが数百または数千行の長い
を分析されているオーディオファイルの長さに応じて、私は最高のM(-22.2)を見つけたいとS値(-28.6)することができそしてこれは私が現在使用しているものです変数MとS

に割り当てる:

ARRAY=() 
while read LINE 
do 
ARRAY+=("$LINE") 
done < $tempDir/text.txt 

for LINE in "${ARRAY[@]}" 
do 
echo "$LINE" | sed -n ‘/B:/p' | sed 's/S:.*//' | sed -n -e 's/^.*M://p' | sed -n -e 's/-//p' >>/$tempDir/R128M.txt 
done 
for LINE in "${ARRAY[@]}" 
do 
echo "$LINE" | sed -n '/M:/p' | sed 's/I:.*//' | sed -n -e 's/^.*S://p' | sed -n -e 's/-//p' >>$tempDir/R128S.txt 
done 

cat $tempDir/R128M.txt 
M=($(sort $tempDir/R128M.txt)) 

cat $tempDir/R128S.txt 
S=($(sort $tempDir/R128S.txt)) 

は、これを行うのより高速な方法はありますか?

+1

はい。通常、速度のためにbashスクリプトを書くことを選択しません。適切なperlスクリプトでさえ、おそらく正規表現の処理の大部分を見ると、ここでは速度の向上が見込まれます。 – davmac

答えて

2

のではなく、メモリ内のファイル全体を読み込む別のファイルにそれのビットを書き込み、再度のものを読んで、それを解析し、最大値は選ぶ:あなたのデータで

$ awk '$7 > m || m == "" { m = $7 } $9 > s || s == "" { s = $9 } END { print m, s }' data 
-22.2 -28.6 

を、フィールド7と9にはMとSの値が含まれています。awkスクリプトは、これらのフィールドで大きな値を見つけて最後に見つかった最大値を印刷すると、ms変数を更新します。値がまだ読み取られていない場合は、m == ""s == ""が値の初期化をトリガするために必要です。

$ awk 'FNR == 1 { m = $7; s = $9; next } $7 > m { m = $7 } $9 > s { s = $9 } END { print m, s }' data 

をシェルにMSにそれらを割り当てるには:クリーナー見えるかもしれawk

もう一つの方法は、

$ declare $(awk 'FNR == 1 { m = $7; s = $9; next } $7 > m { m = $7 } $9 > s { s = $9 } END { printf("M=%f S=%f\n", m, s) }' data) 

$ echo $M $S 
-22.200000 -28.600000 

%sの代わり%f場合を使用するようにprintf()フォーマットを調整浮動小数点数の代わりに元の文字列を使用するか、小数点以下の桁数を設定する必要があります(例:%.2f)。 %f

+0

ありがとう - これは完全に働いた。スクリプトに割り当てるための追加情報を入れていただければ幸いです。 – ssmc

1

まず、3プロセスのパイプは、単一の値抽出のために少し冗長です。特に、ごとにのラインに対して新たに再インスタンス化することを考慮してください。

次に、すべての値をファイルに保存してから、そのファイルをソートします。必要なのは最大値です。すべてのI/OオーバーヘッドとO(NlogN)のソーティング費用でI/Oとソートの代わりに、最初の(値抽出)ループの間に、実行時間を追加してO(N)を簡単に見つけることができます。 bashマニュアルのARITHMETIC EXPANSIONと条件式を参照してください。

関連する問題