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

问题是,这是为了在 for 循环中进入标记为 D$i 的目录,其中调用 $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

而对于第三个(第四个)将是:

filenamer1.5.fdf

以及下一个:

filenamer1.75.fdf

由于我需要 D$i 与 NumPy 范围数据相同,如何才能做到这一点?如果我使用 seq -f %.3g,它只会保留三位更有效的小数,但不会添加小数。如果我使用 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代替%.3gor %g(与 相同)以避免数字超过(for ) 或(for ) 输出为/ 的%.6g风险1000%.3g1000000%g1e+031e+06
  • LC_ALL=C无论用户的区域设置如何,小数基数字符始终.(而不是)。,

无论如何,在 内部$datarange,数字将由换行符分隔,您在 的输出中看到它们以空格分隔的原因echo $datarange是因为您忘记引用该$datarange,因此对其应用了 split+glob ,并且发生了换行符位于 的默认值中$IFS,因此各个数字作为单独的参数传递,并以echo空格分隔输出。

如果您想在 中存储空格分隔的列表$datarange,则需要将sedto的输出通过管道传输paste -sd ' ' -,并且如果您想将这些数字存储为 a 的单独元素bash 大批变量,你可以使用:

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

并使用cmd "${datarange[@]}"将这些元素作为单独的参数传递给cmd,或"${datarange[*]}"将这些元素与第一个字符$IFS(默认为空格)连接起来。

相关内容