Problema Aparando os caracteres finais

0

Eu tenho o seguinte script:

#!/bin/bash

SINGLE='cut -c 7-21 Data.txt'

cd ../FASTA_SEC/

for i in ${SINGLE}; do
    if [ -r ../FASTA_SEC/${i}.fa ]; then
        HEAD='sed -n 2p ../FASTA_SEC/${i}.fa | head -c 3'
        TAIL='tail -c 4 ../FASTA_SEC/${i}.fa'
            if [ "${HEAD}" = "AAA" ]
            then
                    echo "Cut heading A's" $i
                elif [ "${TAIL}" = "AAA" ]
                then
                        echo "Cut tailing A's" $i
                    while [ 'tail -c 2 ../FASTA_SEC/$i.fa' == "A" ]
                     do
                        TRITAIL='cat ../FASTA_SEC/$i.fa'
                        echo ${TRITAIL/A/} > ../FASTA_SEC/$i.fa
                    done
            fi
    else 
        echo "does not exist" $i
    fi
done

Parece funcionar em todos os arquivos de texto processados, incluindo o loop while. Mas há alguns arquivos de texto em que todos os A's são removidos e alguns espaços são introduzidos em vez de excluir apenas os A's finais.

Estou bastante surpreso porque realmente funciona, mas em alguns casos produz uma bagunça. Deixe-me mostrar um exemplo:

Arquivo de entrada que contém um rejeito:

>B4-0K032_18670_015
NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNCNNNGNNNTAGATACAAGCGAGCGGC
GGACGGGTGAGTAACACGTGGGTAACCTGCCCAAGAGACTGGGATAACACCTGGAAACAG
[Cuted here for shortness]
GGNTGTCNTCNGCTNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNAAAAAAAA

Arquivo confuso de saída:

>G4-0K047_18670_010 NNNNNNNNNNCCNCCTGTNNNTTTGCCCCCGGGGGCCTGTCTCTCGGTGTC GTGTCGCCTGGTGGTTCTTCGCGTTGCTTCGTTCCCTGCTCCC
[Cuted here for shortness]
CGTCCGCCNTCGTTCCTGNTGTCTCGGTGCNNGCCCGTNTNNNNNNNNNN NNNNNNNNNNNNN

Eu quero apenas cortar A's para serem cortadas, mas em alguns arquivos de texto uma bagunça ocorre, mas na maioria deles funciona sem problemas. Em alguns arquivos onde os tailing A's deveriam ser aparados eu recebo essa bagunça (até mesmo outros personagens podem ser deletados também ...).

Eu me pergunto se funciona em alguns casos, mas em alguns não. Haveria uma maneira de aparar os A's?

    
por Neuls 11.01.2017 / 22:19

1 resposta

1

O script inteiro acaba dependendo das duas linhas para remover os "A":

tritail=$(cat ../FASTA_SEC/$i.fa)
echo ${tritail/A/} > ../FASTA_SEC/"$i".fa

Como você já está colocando todo o conteúdo do arquivo em uma variável, não é necessário um loop para remover todos os A's posteriores. Você poderia apenas fazer:

tritail="$(cat ../FASTA_SEC/"$i".fa)"
shopt -s extglob
echo ${tritail#+(A)} > ../FASTA_SEC/"$i".fa

Ou, se você não gosta de alterar a configuração extglob:

tritail="$(cat ../FASTA_SEC/"$i".fa)"
echo "${tritail%"${tritail##*[!A]}"}" > ../FASTA_SEC/"$i".fa

Na verdade, esses dois comandos são tudo o que você precisa para remover os A's posteriores.

A segunda linha funciona selecionando todos os A's à direita. Ou, como o comando realmente faz, removendo tudo que é não um A ([! A]) na parte inicial da variável:

tail=${tritail##*[!A]}          # Select all the trailing A's

E então, a string resultante é removida da parte final da variável:

result=${tritail%"$tail"}       # Remove the trailing A's

As duas expansões de parâmetros são reunidas em um único comando:

result=${tritail%"${tritail##*[!A]}"}

E é isso que é enviado para o arquivo (modificado):

echo "${tritail%"${tritail##*[!A]}"}" > ../FASTA_SEC/"$i".fa

Para remover os entrelinhas A, alterne todas as seleções:

echo "${tritail#"${tritail%%[!A]*}"}" > ../FASTA_SEC/"$i".fa
    
por 12.01.2017 / 01:18