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
%.6g
1000
%.3g
1000000
%g
1e+03
1e+06
LC_ALL=C
10進基数文字は、ユーザーのロケールに関係なく、常に.
(ではありません)です。,
とにかく、内部的には、$datarange
数字は改行文字で区切られています。出力で数字がスペースで区切られているように見えるのは、引用符をecho $datarange
忘れていたためです。$datarange
だからここに分割+グロブを適用しましたが、何が起こったのかと改行文字がdefault値$IFS
なので、個々の数字は別々の引数として渡され、echo
出力は空白で区切られます。
スペースで区切られたリストを保存し、数値をaの別の要素として保存するには、出力をtoにパイプする必要があります$datarange
。sed
paste -sd ' ' -
bash
大量に利用可能な変数:
readarray -t datarange < <(
LC_ALL=C seq -f %.15g 0.5 0.25 5.5 |
sed '/\./!s/$/./'
)
cmd "${datarange[@]}"
これらの要素を別の引数として渡すcmd
か、"${datarange[*]}"
これらの要素を最初の文字$IFS
(デフォルトは空白)と関連付けるために使用します。