我想在 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
代替%.3g
or%g
(与 相同)以避免数字超过(for ) 或(for ) 输出为/ 的%.6g
风险1000
%.3g
1000000
%g
1e+03
1e+06
LC_ALL=C
无论用户的区域设置如何,小数基数字符始终.
(而不是)。,
无论如何,在 内部$datarange
,数字将由换行符分隔,您在 的输出中看到它们以空格分隔的原因echo $datarange
是因为您忘记引用该$datarange
,因此对其应用了 split+glob ,并且发生了换行符位于 的默认值中$IFS
,因此各个数字作为单独的参数传递,并以echo
空格分隔输出。
如果您想在 中存储空格分隔的列表$datarange
,则需要将sed
to的输出通过管道传输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
(默认为空格)连接起来。