我有一个脚本希望通过文件目录运行:
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