bash의 list.txt에서 여러 파일 이름을 만들고 새로 생성된 파일의 텍스트를 변경하는 방법은 무엇입니까? [복사]

bash의 list.txt에서 여러 파일 이름을 만들고 새로 생성된 파일의 텍스트를 변경하는 방법은 무엇입니까? [복사]

list.txt 파일의 이름과 각 파일의 텍스트를 사용하여 한 번에 여러 파일을 만들고 싶습니다. 숫자가 list.txt포함된 파일이 있고 이제 해당 ID를 이름으로 사용하여 id별도의 파일을 만들고 싶다고 가정해 보겠습니다 . EOG090W002U_M0.ctl또한 그에 따라 파일의 내용도 변경되어야 합니다.EOG090W00C1_M0.ctlEOG090W00DC_M0.ct

견본list.txt:

EOG090W002U 
EOG090W00C1 
EOG090W00DC 
EOG090W00DE 
EOG090W00E5
EOG090W00HR 
EOG090W00MH 
EOG090W00MS 
EOG090W00PB 
EOG090W00U4
EOG090W00UK 
EOG090W00WM 
EOG090W00WR

예를 들어 파일의 필수 내용은 다음과 같습니다 EOG090W002U_M0.ctl.EOG090W00C1_M0.ctl

seqfile = EOG090W002U_p.phy
treefile = Sametree.txt
outfile = EOG090W002U_M0_mlc

getSE = 0
RateAncestor = 1
Small_Diff = 5e-7
cleandata = 1
fix_blength = 2
method = 0

또는

seqfile = EOG090W00C1_p.phy
treefile = Sametree.txt
outfile = EOG090W00C1_M0_mlc

  getSE = 0
  RateAncestor = 1
  Small_Diff = 5e-7
  cleandata = 1
  fix_blength = 2
  method = 0

여기서 seqfile및 는 다음 outfile에 따라 변경되지만 list.txt파일의 다른 텍스트는 변경되지 않습니다.

감사해요

답변1

while여기에서 문서 주위에 루프를 사용할 수 있습니다 .

while IFS= read -r x; do
  cat << EOF > "${x}_M0.ctl"
  seqfile = ${x}_p.phy
  treefile = Sametree.txt
  outfile = ${x}_M0_mlc

    getSE = 0
    RateAncestor = 1
    Small_Diff = 5e-7
    cleandata = 1
    fix_blength = 2
    method = 0
EOF
done < list.txt

행에 list.txt선행 또는 후행 SPC 또는 TAB 문자가 있는 경우 다음을 수행해야 합니다.아니요파일 이름의 일부로 해석되고(그렇지 않으면 변수를 수정하지 않음 IFS) 명령 IFS=앞의 할당을 생략합니다 read.

while read -r x; do

또는 명시적으로 SPC 및 TAB으로 설정합니다.

while IFS=$' \t' read -r x; do

(이를 다른 공백 문자(예: CR, FF, NBSP... )로 확장하면 특수 IFS 공백 처리가 수신되지 않고 SPC, TAB 및 NL만 수신되므로 작동하지 않습니다.

답변2

#!/bin/bash
tr -d '[:blank:]' < list.txt > outputFile.tmp

for i in $(cat outputFile.tmp)
do
  echo "seqfile = ${i}_p.phy" >> ${i}_M0.ctl
  echo "treefile = Sametree.txt" >> ${i}_M0.ctl
  echo "outfile = ${i}_M0_mlc" >> ${i}_M0.ctl
  echo "" >> ${i}_M0.ctl
  echo "getSE = 0" >> ${i}_M0.ctl
  echo "RateAncestor = 1" >> ${i}_M0.ctl
  echo "Small_Diff = 5e-7" >> ${i}_M0.ctl
  echo "cleandata = 1" >> ${i}_M0.ctl
  echo "fix_blength = 2" >> ${i}_M0.ctl
  echo "method = 0" >> ${i}_M0.ctl
done
exit 0

관련 정보