Bash

seq 中的 2 個小數增量使所有內容都具有 2 個小數

  • March 25, 2021

我想在 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而不是%.3gor %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,則需要通過管道輸出sedto 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(預設為空格)的第一個字元連接起來。

引用自:https://unix.stackexchange.com/questions/640954