whileループの変数に関数を追加する

whileループの変数に関数を追加する

ソフトウェアを実行するためのスクリプトを作成しています。変数のテキストを切り取り、コマンドの他の部分から変数として適用できるように、whileループに関数を追加しようとしています。しかし、この機能を追加する正しい方法は何ですか?

--msa以下は、1つのファイルのみを実行するときの作業コードです。

while read -r i; do 
    raxml-ng --msa ../C049.laln_1l --model $i --prefix C049-rT; 
done < ../C049.model

簡単に紹介すると、私が使用するソフトウェアはraxml-ngです。ソフトウェアを実行するためのパラメータは、、--msaファイル--modelそれぞれ--prefixによって設定されます。各ファイルには対応するおよびが--msaあります。スクリプトを簡単にするために同じ名前を付けました。たとえば、と一致する必要があります。--model--prefixC049.laln_1lC049.modelC049-rT

上記の例に示すように、--msa同じ拡張子を持つ別のファイルがある場合は、次のようにコマンドを繰り返すことができます。

while read -r i; do 
    while read -r j; do
        raxml-ng --msa ../$i.laln_1l --model $j --prefix $i-rT; 
    done < ../$i.model
done < msalist

これで実行するファイルのリスト--msa(にリストされていますmsalist)があり、その一部はファイル拡張子が異なります。

このmsalistファイルには以下が含まれます。

C049.laln_1l
C092.laln_1l
C016.laln_1l
gc30_part.cseq
gc3f.glist.cseq...

私は最初のテキストより前のテキストにのみ名前を付けてmodel使用しました。prefix.

例えば。パラメータリストmodel

C049.model
C092.model
C016.model
gc30_part.model
gc3f.model...

パラメータにも同様ですprefix

だからfind--msaのすべてのファイルを繰り返すbashスクリプトを書くとき、代わりにmsalistdoを使ってみましたが、うまくいかないようです。"$( sed 's/\..*//g' "$i" )".modelC049.modelC049.laln_1l.model

trees=$2
threads=$3

while read -r i; do
        while read -r j; do
                raxml-ng --msa ../"$i" --model "$j" --prefix "$( sed 's/\..*//g' "$i" )"-rT;
        done < ../"$( sed 's/\..*//g' "$i" )".model;
done < "$alnlist"

読みmsalistやすいようにテキストを切り取る方法は?--model--prefix

ベストアンサー1

POSIXシェルから最初の部分を取得するには、次の手順を.実行します。${var%%.*}

while IFS= read -r i; do
  prefix=${i%%.*}
  while IFS= read -r j; do
    raxml-ng --msa ../"$i" --model "$j" --prefix "$prefix-rT";
  done < "../$prefix.model";
done < "$alnlist

また、1行を読む構文ではIFS= read -r lineありませんread -r line

ここでも次のことができます。

while IFS=. read -r prefix rest; do
  while IFS= read -r j; do
    raxml-ng --msa ../"$prefix.$rest" --model "$j" --prefix "$prefix-rT";
  done < "../$prefix.model";
done < "$alnlist

sed最初に始まるすべての項目を削除するには、.まずsed 's/\..*//'削除し、.その後に必要な数の文字を削除します。入力の各行、入力全体ではない$iコンテンツをパラメータではなく入力に渡す必要があります。sed引数を入力を読み取るファイル名と考えてください。

printf '%s\n' "$i" | sed 's/\..*//'

例えば。入力全体の最初の項目から始めてすべての項目を削除するには、次のことをお勧め.します。

printf '%s\n' "$i" | sed '
  :1
  $!{
    # except on the line line, append the next line to the
    # pattern space and loop
    N
    b1
  }
  s/\..*//'

おすすめ記事