Bash

從十進制格式化為指數

  • November 8, 2015

我有以下格式的數據文件 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

第 2 行中的數字佔用的總空間應為 10,不包括 -ve 符號(例如,54.500 為 54.5000000,-161.070 為 -161.070000)。第 3 行和第 4 行的空格應為 13(例如 3.95863757 為 0.3958637E+01)。而 BALT 或 BARM 是變數,可能是另外四個字元的單詞。

謝謝你。

版本 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 ;} 將單獨留下第一個欄位是四個字母的行(儘管可能是 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

引用自:https://unix.stackexchange.com/questions/241593