ソフトウェアを実行するためのスクリプトを作成しています。変数のテキストを切り取り、コマンドの他の部分から変数として適用できるように、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
--prefix
C049.laln_1l
C049.model
C049-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スクリプトを書くとき、代わりにmsalist
doを使ってみましたが、うまくいかないようです。"$( sed 's/\..*//g' "$i" )".model
C049.model
C049.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/\..*//'