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))]
예를 들어, 두 번째 요소에서는 다음과 같은 파일 이름이 생성됩니다(Python 계산에서는 세 번째입니다).
filenamer1.0.fdf
세 번째(네 번째)는 다음과 같습니다.
filenamer1.5.fdf
그리고 다음은:
filenamer1.75.fdf
NumPy 범위 데이터와 동일하려면 D$i가 필요하므로 어떻게 해야 합니까? seq -f %.3g 을 사용하면 더 중요한 소수 자릿수 세 개만 유지하고 소수 자릿수는 추가하지 않습니다. seq -f %.3f 를 사용하면 결과는 아무것도 사용하지 않은 것과 같습니다.
디렉터리를 변경하고 프로그램을 호출하려면 Python을 계속 사용해야 합니까? 아니면 Bash에서 이 문제를 해결할 수 있습니까?
편집: 명확히 하려면 Bash에서 이 작업을 수행하는 데 도움이 필요하며 모든 후행 0을 제거하기 위해 %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
(기본값은 공백) 와 연결하는 데 사용합니다 .