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

문제는 $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%.6g1000%.3g1000000%g1e+031e+06
  • LC_ALL=C10진수 기수 문자는 사용자의 로케일에 관계없이 항상 .(아님) 입니다.,

어쨌든, 내부적으로 $datarange숫자는 개행 문자로 구분됩니다. 출력에서 ​​숫자가 공백으로 구분된 것으로 보이는 이유는 echo $datarange을 인용하는 것을 잊었기 때문입니다. $datarange그래서 여기에 분할+글롭을 적용했는데, 무슨 일이 일어났는가 하면 개행 문자가 default 값 $IFS이므로 개별 숫자는 별도의 인수로 전달되고 echo출력은 공백으로 구분됩니다.

공백으로 구분된 목록을 저장 하고 숫자를 a의 별도 요소로 저장하려면 출력을 to로 파이프 $datarange해야 합니다.sedpaste -sd ' ' -bash 대량으로사용할 수 있는 변수:

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

cmd "${datarange[@]}"이러한 요소를 별도의 인수로 전달 cmd하거나 "${datarange[*]}"이러한 요소를 첫 번째 문자 $IFS(기본값은 공백) 와 연결하는 데 사용합니다 .

관련 정보