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
問題是這是為了進入標有 D 的目錄 $ i in a for loop where $ datarange 被呼叫,但它也將在一個 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))]
導致像這樣的文件名,例如在第二個元素中(在python計數中,而它是第三個):
filenamer1.0.fdf
而對於第 3 次(第 4 次)將是:
filenamer1.5.fdf
下一個:
filenamer1.75.fdf
由於我需要 D$i 與 NumPy 範圍數據相同,如何才能做到這一點?如果我使用 seq -f %.3g,它只會保留三個更重要的小數,但不會添加小數。如果我使用 seq -f %.3f,結果與我根本不使用任何東西的結果相同。
我是否需要堅持使用 Python 來更改目錄並呼叫程序,還是可以在 Bash 中解決?
編輯:澄清一下,我需要幫助才能在 Bash 中做到這一點而且我不想使用 %g 消除所有尾隨零,因為例如,正如您在 Python arange 1. 中看到的那樣,這樣的字元串會保留為 1.0 等,所以我無法正確讀取文件。
聽起來您想要 的輸出
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
or%g
(same as%.6g
) 以避免數字超過1000
(for%.3g
) 或1000000
(for%g
) 被輸出為1e+03
/1e+06
LC_ALL=C
無論使用者的語言環境如何,十進制基數字元始終是.
(而不是)。,
無論如何,在內部
$datarange
,數字將由換行符分隔,您在輸出中看到它們以空格分隔的原因echo $datarange
是因為您忘記引用它$datarange
,因此對其應用了 split+glob,並且換行符發生為 的預設值$IFS
,因此各個數字作為單獨的參數傳遞,並以echo
空格分隔。如果您想在 中儲存一個空格分隔的列表
$datarange
,則需要通過管道輸出sed
topaste -sd ' ' -
,並且如果您想將這些數字儲存為bash
數組變數的單獨元素,您可以使用:readarray -t datarange < <( LC_ALL=C seq -f %.15g 0.5 0.25 5.5 | sed '/\./!s/$/./' )
並用於
cmd "${datarange[@]}"
將這些元素作為單獨的參數傳遞給cmd
,或"${datarange[*]}"
將這些元素與$IFS
(預設為空格)的第一個字元連接起來。