디지털 파일의 데이터 형식을 변경하는 효과적인 방법

디지털 파일의 데이터 형식을 변경하는 효과적인 방법

그래서 다음 형식의 행렬 값을 포함하는 큰 파일이 있습니다.

(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

관련 정보