デジタルファイルのデータ形式を変更する効果的な方法

デジタルファイルのデータ形式を変更する効果的な方法

したがって、次の形式の行列値を含む大きなファイルがあります。

(0,0) 0.6666
(0,1) 0.0000
(0,2) 1.3333
...

私はそれを次のように変換したいと思います:

0 0 0.6666e+00
0 1 0.0000e+00
0 2 1.3333e+00
...

次のスクリプトを使用してこれを実行できます。

#!/bin/bash

input="$1"
while read coord val; do
   printf "%s" "${coord//,/ }" | awk -F '[()]' '{printf "%s",$(NF-1)}'  
   printf " %8.3e\n" "$val"
done < "$input"

しかし、私の場合は非常に遅いです(ライン9409)。これをどのようにすばやく実行できますか?

答え1

これは少し異なるawkアプローチです。これはsuband gsub1を使用するよりも高速です。

awk -F'[(,)]' '{printf "%s %s %8.3e\n",$2,$3,$4}' file

15000000行のファイルでテストしましたが、gsub / sub方式より約2秒ほど高速でした違いは大きくありませんが、大容量ファイルの場合は重要です。

答え2

別々に行うと高速ですawk

awk '
{
  gsub("[()]", "", $1)
  sub(",", " ", $1)
  $2 = sprintf("%8.3e", $2)
  print
}' <file

関連情報