파일의 각 줄을 다른 변수에 저장하고 명령줄 입력 및 출력에서 ​​각 변수를 하나씩 사용합니다.

파일의 각 줄을 다른 변수에 저장하고 명령줄 입력 및 출력에서 ​​각 변수를 하나씩 사용합니다.

저는 쉘 스크립팅을 처음 접했기 때문에 이전에 이 질문을 받은 적이 있다면 사과드립니다.

다음과 같은coordinates.txt 파일이 있습니다.

765442
866447
755343
097754

파일의 각 줄의 각 값을 변수에 전달하고 해당 값을 명령줄의 입력으로 하나씩 사용하고 해당 숫자를 파일 이름의 일부로 저장하고 싶습니다. 다음 코드를 작성했지만 이것이 올바른 방법인지 확실하지 않습니다 ...

cat coordinates.txt | while read LINE; do
    var="$(echo $LINE)"
    /home/users/scripts/TreeView/TreeView.sh -o $NAME_ALL.chr1.new_estimate.trees.$var --bp_of_interest $var
done

따라서 출력 -o에서 각 값은 한 번에 하나씩 파일 이름에 추가되고 각 값은 한 번에 하나씩 --bp_of_interest로도 사용됩니다.

어떤 제안이라도 높이 평가하겠습니다. 감사해요

답변1

귀하의 루프는 다음과 같이 작성하는 것이 가장 좋습니다.

PATH=/home/users/scripts/TreeView:$PATH

while IFS= read -r line; do
    TreeView.sh -o "$name_all.chr1.new_estimate.trees.$line" --bp_of_interest "$line"
done <coordinates.txt

이로 인해 다음이 변경됩니다.

  • /home/users/scripts/TreeView앞쪽 에 추가했어요 $PATH. 이를 통해 TreeView.sh절대 경로를 추가하지 않고도 호출을 할 수 있습니다 .
  • var입력 파일에서 읽은 값과 동일한 값이므로 변수를 제거했습니다 .
  • 내가 사용하는 IFS= read -r line이유는 ""IFS=read-r-line" 이해".
  • 저는 "라는 이유로 변수 이름을 소문자로 사용합니다.쉘 스크립트의 변수에 대한 명명 규칙이 있습니까?".
  • cat이 경우에는 필요하지 않기 때문에 리디렉션을 통해 파일의 데이터를 루프에 전달합니다 .

동일한 작업을 수행하는 또 다른 방법:

PATH=/home/users/scripts/TreeView:$PATH

xargs -I {} TreeView.sh -o "$name_all.chr1.new_estimate.trees.{}" --bp_of_interest "{}" <coordinates.txt

xargs각 행에서 읽은 데이터를 가 나타내는 위치의 coordinates.txt스크립트 매개변수에 삽입하는 데 사용됩니다 .TreeView.sh{}

명령줄(예: before , 숫자는 어디에 있음) -P n에 추가하여 스크립트의 여러 병렬 인스턴스를 한 번에 실행할 수도 있으며 , 각 인스턴스는 해당 명령줄에 적절한 데이터를 삽입합니다 .xargs-I {}ncoordinates.txt

관련 정보