소수에서 지수로 형식 지정

소수에서 지수로 형식 지정

다음 형식의 데이터 파일 abc.txt가 있습니다.

BALT 1
 54.500 -161.070
 3.95863757
 0.01691576
BARM 2
 -9.200 67.120
 4.07529868
 0.01951653
BKSR 3
 43.830 142.520
 4.08919819
 0.00587340

다음 형식으로 변환해야 합니다.

BALT 1
 54.5000000 -161.070000
 0.3958637E+01
 0.1691576E-01
BARM 2
 -9.20000000 67.1200000
 0.4075298E+01
 0.1951653E-01
BKSR 3
 43.8300000 142.520000
 0.4089198E+01
 0.5873400E-02

두 번째 줄의 숫자가 차지하는 총 공백은 -ve 기호를 제외하고 10이어야 합니다(예: 54.500은 54.5000000, -161.070은 -161.070000). 세 번째와 네 번째 줄의 공백은 13이어야 합니다(예: 0.3958637E+01로 3.95863757). 그리고 BALT 또는 BARM은 변수이며 4개의 문자로 구성된 또 다른 단어일 수 있습니다.

감사합니다.

답변1

버전 3다음과 같은 awk 파일을 사용하십시오.

function tenth(x) {
  u = x ; if ( u < 0 ) u = -x ;
  b=10 ;
  a=b-2 ;
  if ( u >= 10 ) {
  d=int(log(u)/log(10)) ;
  a=b-d-1 ;
  }
  printf "%*.*f",b,a,x ;
}
length($1) == 4 { print ; next  ;}
NF == 1 { d=int(log($1)/log(10)) ;if (d> -1) d++ ; printf " %.7fE%+03d\n",$1/(10^d),d ;}
NF == 2 { printf " " ; tenth($1); printf " " ; tenth($2) ; printf "\n" ;}

어디

  • lengtht$1) == 4 { print ; next ;} 첫 번째 필드가 4글자인 줄은 그대로 둡니다(1234일 수도 있음).
  • function tenth(x): 형식을 조정하는 기능을 정의합니다.
  • "%*.*f"문자열은 변환의 크기/정밀도를 조정합니다 %f. 첫 번째 *는 b로 대체되고, 두 번째 *는 a로 대체됩니다.
  • int(log()/log(10))특정 요구에 맞게 표현을 조정하는 십진수 로그를 제공하시겠습니까?

함께 사용하세요

awk -f f.awk input

결과적으로주는

BALT 1
 54.5000000 -161.070000
 0.3958638E+01
 0.1691576E-01
BALT 2
 -9.20000000 67.1200000
 0.4075299E+01
 0.1951653E-01
BALT 3
 43.8300000 142.520000
 0.4089198E+01
 0.5873400E-02
 0.00000000 1.00000000
 -3.14150000 2.71828183

답변2

어쩌면 다음과 같을 수도 있습니다:

awk '
  !/[[:alpha:]]/{
    if (NF == 1)
      $0 = sprintf(" %.7E", $0 * 10)
    else
      $0 = sprintf(" %.8f %.8f", $1, $2)
  }
  {print}' | sed '
    s/\([0-9.]\{10\}\)[0-9]*/\1/g
    s/\([1-9]\)\.\(.*\).E/0.\1\2E/'

답변3

다음을 사용하여 awk 없이 얻을 수 있습니다.

while read line; do echo $line; read a; read b; read c;  printf "%.7f %.7f\n %.7e\n %.7e\n" $a $b $c; done < data.txt

그러나 이 방법으로 printf를 사용하면 마침표 대신 쉼표를 사용하여 일부 로케일을 사용하는 경우 몇 가지 문제가 발생할 수 있습니다. 이 경우 다음을 사용하여 문제를 해결할 수 있습니다.

while read line; do echo $line; read a; read b; read c; LC_NUMERIC="en_US.UTF-8" printf "%.7f %.7f\n %.7e\n %.7e\n" $a $b $c; done < data.txt

물론, 스크립트에서는 캐리지 리턴과 들여쓰기를 사용하여 형식을 더 잘 지정해야 합니다.

관련 정보