Usando um 'for loop', execute um script em todos os arquivos em um diretório

1

Eu tenho um script que desejo executar em um diretório de arquivos:

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

Eu testei esse script e ele funciona bem para o que eu preciso fazer.

O que eu quero fazer é criar um loop for que irá aplicá-lo a todos os arquivos em um diretório. Eu tentei o abaixo, e não funcionou. Variações disso também foram tentadas.

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

Sou relativamente novo na programação, por isso qualquer ajuda é apreciada.

    
por Luke Bridgman 24.08.2016 / 05:21

2 respostas

1

Seu script não está usando a variável filename do loop. filename.fastqsanger não se refere a uma variável e implica que o nome completo do arquivo não está presente, embora seja.

Aqui está a versão corrigida:

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
    
por 24.08.2016 / 06:02
-1

Você não está usando a variável filename na linha abaixo:

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

Tente:

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

Isso salva o nome da base do arquivo em $fname para que:

/Test/abcd.fastqsanger torna-se /Test/abcd.fasta em vez de /Test/abcd.fastqsanger.fasta

    
por 24.08.2016 / 05:47