特定のディレクトリ(シーケンスと呼ばれる)のすべてのファイルを繰り返し処理し、各ファイルに対して2つの機能を実行しようとしています。私は個々のファイル上でそれらを実行できるので、関数(blastpとcat行)が機能することを知っています。通常、私はクエリ、出力などの特定のファイル名を持っていますが、ループが多くのファイルを処理できるように変数を使用しようとしています。ディレクトリ内のファイルを繰り返し、出力ファイルを作成するlinux
(免責事項:私はコーディングが新しくなりました。)自分のファイル名を自分の関数内で使用しようとすると重大な問題に遭遇していると思います。そのままでは、私のコードは実行されますが、余分な意図しないファイルがたくさん作成されます。これは私のスクリプトが行うことを意図したものです:
行1: "シーケンス"ディレクトリのすべてのファイルを繰り返します。 (すべてが ".fa"で終わっていれば役に立ちます)
3行目:ファイル名を変数として認識します。
4行目: "query"フラグの引数としてファイル名を使用してblastp関数を実行します。常に "database.faa"を使用してください。これは、 "db"フラグの引数として指定し、最初のファイルと同じ名前が末尾に ".txt"を持つ新しいファイルに結果を出力します。
行5:行4からの出力ファイルの一部を、最初のファイルと同じ名前が末尾に「_top_hits.txt」という名前の新しいファイルに出力します。
for sequence in ./sequences/{.,}*;
do
echo "$sequence";
blastp -query $sequence -db database.faa -out ${sequence}.txt -evalue 1e-10 -outfmt 7
cat ${sequence}.txt | awk '/hits found/{getline;print}' | grep -v "#">${sequence}_top_hits.txt
done
私はこのコードを実行したとき、それは私に、ディレクトリ内の各ファイルから派生し6つの新しいファイルを与えた(そして、彼らは、同じディレクトリ内のすべてのだった - 。私は自分のフォルダにそれらすべてを持っていることを好むだろうがどのようにそれをしてもいいですか?)。彼らはすべて空だった。接尾辞は ".txt"、 ".txt.txt"、 ".txt_top_hits.txt"、 "_top_hits.txt"、 "_top_hits.txt.txt"、および "_top_hits.txt_top_hits.txt"でした。
私が何かを明確にするための詳細情報を提供できる場合は、私に知らせてください。
少なくとも1つの問題は、同じ機能を同じディレクトリで複数回実行しようとしているようです。あなたがそれを実行するたびに、前の実行で生成した新しいファイルをループが見つけ、それを操作しようとしていると思います。私が知る限り、あなたは '* .fa'で終わるファイルにあなたのファイル検索を制限していませんが、あなたがそれをすることをお勧めします。さもなければ、あなたは新しく出力された '.txt'ファイルを処理し続け、より誤った出力を生成します。 – aardvarkk
私は同意する、私はそれを行う必要があります。私はそれを解決するための別の方法は、すべての出力ファイルを別々のディレクトリに出力することだと思います。 * .faで終わるファイルを繰り返し処理するにはどうすればよいですか?それを1行目に入れますか? – lynkyra