O script bash para de usar variável sem motivo

0

Estou preso neste script. Eu defini uma variável com um único gato de um arquivo temporário e estas são as seguintes operações feitas pelo script.

PROJECT=$(cat temp/project_name_final) ;

#Bifidobacterium contigs selection

grep "Bifidobacterium" ${PROJECT}_genera.txt | gawk '{print $2}' > temp/${PROJECT}_Bif_genera ;
gawk '{print $3}' ${PROJECT}_species.txt > temp/${PROJECT}_Bif_species ;
grep -v -f temp/${PROJECT}_Bif_species temp/${PROJECT}_Bif_genera > temp/${PROJECT}_selected_Bif ;

O primeiro grep funciona bem, o awk também. A variável é usada bem no nome do arquivo fornecido. O último grep parece funcionar mal, e o arquivo gerado é chamado "_selected_Bif", então a variável não é usada como antes. Estou tentando encontrar uma maneira de explicar por que tenho esse problema.

TL; DR Nenhum dos arquivos usados está vazio. O arquivo esperado, chamado "$ {PROJECT} _selected_Bif" também não poderia estar vazio, se o grep funcionar como esperado.

    
por Shred 12.06.2018 / 11:49

3 respostas

1

Eu realmente não consigo ver por que a variável PROJECT não está sendo expandida corretamente na sua última linha de código (a menos que você esteja procurando no lugar errado pelo arquivo gerado), mas eu vejo que você não está t citar duas vezes suas expansões variáveis. Não duplicar as citações causaria problemas assim que $PROJECT contivesse espaços ou novas linhas, ou qualquer outro caractere especial para o shell.

Você também está pulando por muitos obstáculos para algo que poderia ser feito com um único programa awk :

proj=$(<temp/project_name_final)

awk 'NR==FNR { species[$3]; next } /Bifidobacterium/ && !($2 in species) { print $2 }' \
    "${proj}_species.txt" "${proj}_genera.txt" >"temp/${proj}_selected_Bif"

Este programa awk lê os dois arquivos ${proj}_species.txt e ${proj}_genera.txt . Ao ler o primeiro arquivo, sua terceira coluna é usada para criar uma chave na matriz associativa ou hash species . Quando começamos a ler o segundo arquivo, estamos interessados somente nas linhas que contêm a string Bifidobacterium e cuja segunda coluna não é uma chave no species hash. Para essas linhas, produzimos a segunda coluna.

Toda a saída vai para temp/${proj}_selected_Bif .

Observe a aspas duplas de todas as expansões da variável proj . Eu usei um nome de variável com casete baixo, uma vez que variáveis de invólucro superior são reservadas para variáveis de ambiente de sistema e shell.

Veja também

por 12.06.2018 / 12:51
1

Seu arquivo inicial contém uma linha que termina com CR / LF. O CR é realizado como parte da variável $PROJECT e, como CR é um caractere válido em um nome de arquivo, todas as etapas intermediárias funcionam corretamente. (Mas os nomes dos arquivos estão "errados".)

A última saída também está correta, mas o CR no nome do arquivo é interpretado para forçar o cursor de volta ao início da linha, então tudo que você vê é _selected_Bif .

Você pode provar isso removendo o CR enquanto lê o conteúdo do arquivo.

    
por 13.06.2018 / 01:04
0

Eu resolvi. O problema aqui é que o grep sem outra instrução não é capaz de manipular as linhas sem classificá-las. Assim, o arquivo de saída estará vazio e, não sei por que, o grep criará esse arquivo vazio, mas com um nome de arquivo incorreto. (alguém sabe por quê?)

Então, em vez de

$ grep -v -f 

Eu usei

$ grep -F -x -v -f 
    
por 12.06.2018 / 12:37