seq で小数点 2 ずつ増加すると、すべてが小数点以下 2 桁になります。

seq で小数点 2 ずつ増加すると、すべてが小数点以下 2 桁になります。

Bashでこのコマンドを使用したいと思います。

datarange=$(seq 0.5 0.25 5.5)

出力を含む

echo $datarange = 0.50 0.75 1.00 1.25 1.50 1.75 2.00 2.25 2.50 2.75 3.00 3.25 3.50 3.75 4.00 4.25 4.50 4.75 5.00 5.25 5.50

問題は、$ datarangeが呼び出されるforループからD $ iというディレクトリに移動し、qsubファイルの場合は、次のようにpython numpy arangeの後に番号付けされたいくつかのファイルを呼び出すことです。

>>> import numpy as np
>>> Steps=np.arange(0.5,5.75,0.25)
>>> print(Steps)
[0.5  0.75 1.   1.25 1.5  1.75 2.   2.25 2.5  2.75 3.   3.25 3.5  3.75
 4.   4.25 4.5  4.75 5.   5.25 5.5 ]

名前にはstrが必要なので、Pythonで書いた。

filenamelist=[filenamer+str(Steps[j])+'.fdf' for j in range(len(Steps))]

たとえば、2番目の要素では次のファイル名が生成されます(Pythonの計算では3番目)。

filenamer1.0.fdf

3番目(4番目)は次のとおりです。

filenamer1.5.fdf

そして次は:

filenamer1.75.fdf

NumPy範囲データと同じにはD $ iが必要なので、どうすればよいですか? seq -f %.3g を使用すると、3 つの重要な小数点以下の桁数が維持され、小数点以下の桁数は追加されません。 seq -f %.3f を使用すると、結果は何も使用しなかったのと同じです。

ディレクトリを変更してプログラムを呼び出すには、Pythonを引き続き使用する必要がありますか?それともBashでこの問題を解決できますか?

編集:明確にするには、Bashでこれを行うのに役立つ必要があり、すべての末尾のゼロを削除するために%gを使用したくありません。たとえば、Python arange 1に示すように、1.0などのような文字列に残っているため、ファイルを正しく読み取ることができません。

ベストアンサー1

目的の出力のように聞こえますが、ドットが追加された場合(またはあなたの質問が明確ではないかもしれません)、ドットはありませんLC_ALL=C seq -f %.15g 0.5 0.25 5.5..0

datarange=$(
  LC_ALL=C seq -f %.15g 0.5 0.25 5.5 |
    sed '/\./!s/$/./'
)

(またはsed '/\./!s/$/.0/'追加.0

ここでは以下を使用してください。

  • %.15g数字が(の場合)または(の場合)出力を超える危険を避けるために、%.3gまたは(同じ)を交換してください。%g%.6g1000%.3g1000000%g1e+031e+06
  • LC_ALL=C10進基数文字は、ユーザーのロケールに関係なく、常に.(ではありません)です。,

とにかく、内部的には、$datarange数字は改行文字で区切られています。出力で数字がスペースで区切られているように見えるのは、引用符をecho $datarange忘れていたためです。$datarangeだからここに分割+グロブを適用しましたが、何が起こったのかと改行文字がdefault値$IFSなので、個々の数字は別々の引数として渡され、echo出力は空白で区切られます。

スペースで区切られたリストを保存し、数値をaの別の要素として保存するには、出力をtoにパイプする必要があります$datarangesedpaste -sd ' ' -bash 大量に利用可能な変数:

readarray -t datarange < <(
  LC_ALL=C seq -f %.15g 0.5 0.25 5.5 |
    sed '/\./!s/$/./'
)

cmd "${datarange[@]}"これらの要素を別の引数として渡すcmdか、"${datarange[*]}"これらの要素を最初の文字$IFS(デフォルトは空白)と関連付けるために使用します。

おすすめ記事