次の形式のデータファイル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 は変数ですが、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に、2番目の*をaに置き換えます。int(log()/log(10))
特定のニーズに合わせて表現を調整するための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