2016-10-05 6 views
1

コンテキスト

Fortranのプログラミング言語で

は、フォーマット、「D」の形式があります。例えば、フロート:Dおよび浮動小数点この疑似科学的表記法を用いて、はい「0.xxxxxD + X」

0.123456D+4 

1234.56 

はとして印刷されます。


私は貝に、この特定の書式を再現したいと思います。質問

(ウィッヒは仕方によってcshのですが、私たちは気にしない)AWKのおかげで、より少ない可能「のsed」。 AWKは必須ではありませんが、私は(開始時に「e」の形式%eで、いくつかは、後に「sedの」)それを行うには良い方法だと思う

私は


ここにありますテキスト最初に読む必要があります:

これは、Fortranのツールの一般的な入力/設定ファイル(読み込む2つのフロートあり)です。ここ

そしてあるC-シェルで私の完全にコメントコード:

set var_str_ori = `cat "$file" | awk '{print $2}'` # var_str_ori = "0.12345D+4" 

# Transforming into a calculable float 
set var_ori = `echo "$var_str_ori" | sed s/D/E/g | awk '{printf "%f", $1}'` # var_ori = 1234.500000 

# Do some calculus 
set var__new = `echo "$var_ori + 42.3" | \bc -l` # var_new = 1276.800000 

# Re-formatting (the tricky part!) 
set var_str_new = `echo "$var__new" | awk '{printf "%E", $1}' | awk -F. '{print "0."$1$2}' | awk -F"E+" '{print $1"D+0"$2+1}'` # var_str_new = "0.12768D+4" 

、よく次のようになり、新たなファイル取得するためにフォーマットされた新しい$var_str_new書く:

NU  0.12768D+4  0.56789D+5 

ようにAWK/sedを使って真の科学的フォーマット(x.xxxxE+x)をFortran Dフォーマットに再フォーマットするというトリックがあります。さて、それだけです!あなたは何か提案があるなら...私はCシェルで、 "関数"の定義なしで覚えています。それは純粋なシェルの一種!

最後に、私は自分のコードを単純化できると知っていますが、これはポイントではありません(この例は意図的に冗長で最適化されていません)。私の本当の疑問は、 "D Fortranのような"フォーマットでどのようにフォーマットするかです。

+2

それはあなたがいないことは注目に値するかもしれ追加することができ、awk

を関数を書くことができますFortranツールの入力に指数を示す「d」または「e」があるかどうかを心配する必要があります。それらは同じように扱われます。 – francescalus

+0

あなたはそうですが、これは特定のFortranツールであり、 'D'指数を与える必要があります。 – Apollonaute

+0

"0.1234D + 12"フォーマット(先頭にゼロが付いている)が必要な場合は、francescalusと完全に同意しますが(通常は通常のEが機能するはずです)、1行のFortranコード、倍精度x; read *、x; print "(D15.6)"、x; 'var = $(echo" 1.23 "| ./a.out)のように、あなたのシェルでa.outを使うことができます(' 'test.f90') 'bashでは、0.123000D + 01になります)。あるいは単純に、E(+ | - )[digits]をD(+ | - )[digits]で置き換えることができます。 – roygvib

答えて

0

あなたはこれがあなたが始めることがあり、それは負の指数を処理しませんが、簡単にだけでなく

$ awk 'function tovalue(x) 
     {split(x,xa,"D"); 
      return xa[1]*10^xa[2]} 
     function format(x) 
     {p=length(int(x)); 
      return x/(10^p)"D+"p} 

     {print v2=tovalue($2), v3=tovalue($3), format(v2+11)}' file 

1234.5 56789 0.12455D+4 
関連する問題