![십진수에서 지수로의 형식](https://linux55.com/image/76924/%EC%8B%AD%EC%A7%84%EC%88%98%EC%97%90%EC%84%9C%20%EC%A7%80%EC%88%98%EB%A1%9C%EC%9D%98%20%ED%98%95%EC%8B%9D.png)
다음 형식의 데이터 파일 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
두 번째 줄의 숫자가 차지하는 총 공간은 10이어야 합니다(-ve 기호 제외)(예: 54.500은 54.5000000, -161.070은 -161.070000). 3행과 4행의 공백은 13이어야 합니다(예: 3.95863757은 0.3958637E+01입니다). 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
물론 스크립트에서 더 나은 형식을 지정하려면 캐리지 리턴과 들여쓰기를 사용해야 합니다.