그래서 다음 형식의 행렬 값을 포함하는 큰 파일이 있습니다.
(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