ファイルディレクトリを介して実行したいスクリプトがあります。
awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < TNGA_C_0hr_Joined_Asz1.fastqsanger | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p' | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > TNGA_C_0hr_Asz1_Collapsed.fasta
このスクリプトをテストしたところ、私の要件にはうまくいきました。
私がしたいのは、ディレクトリ内のすべてのファイルに適用されるforループを作成することです。私は成功せずに次のことを試しました。また、変形を試みました。
for filename in /Test/*.fastqsanger; do
awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < filename.fastqsanger | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p' | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > filename.fasta
done
私はプログラミングにはあまり慣れていないので、助けてくれてありがとう。
答え1
filename
あなたのスクリプトはループに変数を使用しません。filename.fastqsanger
変数を引用しないということは、完全なファイル名がすでに存在するがまだ存在しないことを意味します。
修正されたバージョンは次のとおりです。
for filename in /Test/*.fastqsanger; do
awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < $filename | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p' | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > $filename.fasta
done
答え2
filename
次の行では変数を使用しません。
for filename in /Test/*.fastqsanger; do
awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < filename.fastqsanger | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p' | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > filename.fasta
done
努力する:
for filename in /Test/*.fastqsanger
do
fname=`basename $filename .fastqsanger`
awk '{if(NR%4==1) {printf(">%s\n",substr($0,2));} else if(NR%4==2) print;}' < $filename | awk 'NR%2==0' | sed 's/TGAGATGTGA/*/p' | cut -d '*' -f 2 -s | sort -k 1.180,1.194 -u | cat -n | sed 's/^/>/' | tr "[\t]" "\n" > $fname.fasta
done
$fname
これにより、次のようにファイルのデフォルト名が保存されます。
/Test/abcd.fastqsanger
/Test/abcd.fasta
~よりなる/Test/abcd.fastqsanger.fasta