したがって、次の形式の行列値を含む大きなファイルがあります。
(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
アプローチです。これはsub
and gsub
1を使用するよりも高速です。
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