1つのファイルの名前を使用して一度に複数のファイルを作成したいと思いますlist.txt
。どうすればいいですか?
サンプルlist.txt
:
EOG090W002U
EOG090W00C1
EOG090W00DC
EOG090W00DE
EOG090W00E5
EOG090W00HR
EOG090W00MH
EOG090W00MS
EOG090W00PB
EOG090W00U4
EOG090W00UK
EOG090W00WM
EOG090W00WR
list.txt
いくつかのID番号を含むこれがあるとしましょう。次に、これらのIDを名前として別々のファイルを作成したいと思います(例:、、、EOG090W002U_M0.ctl
)。また、それに応じてファイルの内容も変更する必要があります。たとえば、ファイルの内容は次のとおりです。EOG090W00C1_M0.ctl
EOG090W00DC_M0.ctl
EOG090W002U_M0.ctl
EOG090W00C1_M0.ctl
seqfile = EOG090W002U_p.phy
treefile = Constant.txt
outfile = EOG090W002U_M0_mlc
または
seqfile = EOG090W00C1_p.phy
treefile = Constant.txt
outfile = EOG090W00C1_M0_mlc
*.phy
のようConstant.txt
なフォルダで使用できます。
答え1
最も簡単:
xargs touch <List.txt
魔法は、xargs
標準入力のすべての行を取得し、コマンドに引数として追加することです。
答え2
スクリプトでGNU並列処理を使用する:
#!/bin/bash
constant=constant
populate_file () {
local const=$1
local file=$(basename -s '.M0.ctl' "$2")
printf '%s\n%s\n%s\n' \
"seqfile = ${file}_p.phy" \
"treefile = ${const}.txt" \
"outfile = ${file}_M0_mlc" > "$2"
}
export -f populate_file
parallel populate_file "$constant" {}.M0.ctl :::: list.txt
その後、各行の行を並列に読み込み、list.txt
関数を実行します。populate_file
このpopulate_file
関数は、必要な形式で各ファイルに3行を出力します。
GNU 並列処理がない場合は、読み込み中にループを使用できます。
#!/bin/bash
constant=constant
populate_file () {
local const=$1
local file=$(basename -s '.M0.ctl' "$2")
printf '%s\n%s\n%s\n' \
"seqfile = ${file}_p.phy" \
"treefile = ${const}.txt" \
"outfile = ${file}_M0_mlc" > "$2"
}
while IFS= read -r file; do
populate_file "$constant" "${file/ /}.M0.ctl"
done < list.txt
答え3
次のように試すことができます。
for i in $(cat list.txt); do touch $i; done
答え4
#!/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 = constant.txt" >> ${i}_M0.ctl
echo "outfile = ${i}_M0_mlc" >> ${i}_M0.ctl
done
exit 0
説明する:
tr -d '[:blank:]' < list.txt > outputFile.tmp
リストからスペースを削除してコピーします。outputFile.tmp
for
ファイルのすべての行を繰り返し、outputFile.tmp
ファイルを動的に生成して、必要なコンテキストをファイルに追加します。