使用“for 循环”,对目录中的所有文件运行脚本

使用“for 循环”,对目录中的所有文件运行脚本

我有一个脚本希望通过文件目录运行:

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

相关内容