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.ctlEOG090W00C1_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

関連情報