所以我有一个大文件,其中包含具有以下格式的矩阵值:
(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
1我在一个有 5000000 行的文件上测试了它,它比 gsub/sub 方法快了约 2 秒。差别不大,但对于大文件可能很重要。
答案2
如果你单独做的话会更快awk
:
awk '
{
gsub("[()]", "", $1)
sub(",", " ", $1)
$2 = sprintf("%8.3e", $2)
print
}' <file