web-dev-qa-db-ja.com

bashのlist.txtから複数のファイル名を作成するにはどうすればよいですか?

ファイルlist.txtの名前を使用して一度に複数のファイルを作成したいのですが、どうすればよいですか?

サンプルlist.txt

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

このlist.txtにID番号が含まれているとします。次に、これらのIDを名前として使用して個別のファイルを作成します(例:EOG090W002U_M0.ctlEOG090W00C1_M0.ctlEOG090W00DC_M0.ctl)。また、それに応じてファイルの内容を変更する必要があります。たとえば、EOG090W002U_M0.ctlEOG090W00C1_M0.ctlファイルのコンテンツは

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

または

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

ここで、*.phyConstant.txtは同じフォルダーに提供されます。

3

最も簡単:

xargs touch <List.txt

マジックは、xargsが標準入力のすべての行を受け取り、それをコマンドの引数として追加することです。

5
xenoid

スクリプトで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
3
jesse_b
#!/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

説明:

  1. tr -d '[:blank:]' < list.txt > outputFile.tmpは空白をリストから削除し、outputFile.tmpにコピーします
  2. forループは、outputFile.tmpからすべての行を読み取り、ファイルをオンザフライで作成することにより、必要なコンテキストをファイルに追加します。
0
Vikram Tidake

あなたは次のようなことを試すことができます:for i in $(cat list.txt); do touch $i; done

0

別の方法

tr -s '[:blank:]' '[\n*]' < list.txt | 
  while IFS= read -r Word; do
   touch "$Word";
  done

この回答は、ファイル内のすべての「単語」が同じ(最初の)行にあり、空白文字で区切られているという前提で提供されています。

0
Paulo Tomé