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