ファイル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
は同じフォルダーに提供されます。
最も簡単:
xargs touch <List.txt
マジックは、xargs
が標準入力のすべての行を受け取り、それをコマンドの引数として追加することです。
スクリプトでGNU parallelを使用する:
#!/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 parallelがない場合、while読み取りループを使用できます。
#!/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
#!/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
からすべての行を読み取り、ファイルをオンザフライで作成することにより、必要なコンテキストをファイルに追加します。あなたは次のようなことを試すことができます:for i in $(cat list.txt); do touch $i; done
別の方法
tr -s '[:blank:]' '[\n*]' < list.txt |
while IFS= read -r Word; do
touch "$Word";
done
この回答は、ファイル内のすべての「単語」が同じ(最初の)行にあり、空白文字で区切られているという前提で提供されています。