Resultados diferentes ao usar script ou colar código

0

Eu escrevi um código unix que executa aritmética em meus arquivos e cria uma matriz de dados em analysis.txt (com cabeçalhos adicionados). No entanto, quando tentei colocar esse código em um script e executar o script, as guias (\ t) separam minhas colunas em vez do espaço em branco real.

Código que funciona:

for f in */Data/Intensities/BaseCalls/Alignment*/*.bam; do
 echo 'Processing '$f' ... ' 1>&2
 name=${f##*/}
 name=${name%.bam}
 pftot='samtools view -c $f'
 pfmit='samtools view -c $f chrM'
 pfgen=$((pftot-pfmit))
 pfratio='python -c 'print float('$pfmit')/'$pfgen'
 ftot='samtools view -c -q 30 -F 1536 $f'
 fmit='samtools view -c -q 30 -F 1536 $f chrM'
 fgen=$((ftot - fmit))
 fratio='python -c 'print float('$fmit')/'$fgen'
 echo $name'\t'$pftot'\t'$pfmit'\t'$pfgen'\t'$pfratio'\t'$ftot'\t'$fmit'\t'$fgen'\t'$fratio
done | awk 'BEGIN{print 
"name\ttotal\tmDNA\tchrDNA\tratio\tftotal\tfmDNA\tfchrDNA\tfratio"}{print}' 
> Analysis.txt

Código que não funciona:

#!/bin/bash
for f in */Data/Inten... "the above code"

Executar com:

bash Analysis.sh

imprime as variáveis na última linha de eco com separadores literais "\ t".

Sou bastante novo, portanto, quaisquer sugestões ou recursos são bem-vindos.

    
por Stewart Russell 16.06.2017 / 17:27

3 respostas

2

Esta linha:

echo $name'\t'$pftot'\t'$pfmit'\t'$pfgen'\t'$pfratio'\t'$ftot'\t'$fmit'\t'$fgen'\t'$fratio

terá o \t inserido diretamente. Pode-se ver algo semelhante a partir de um prompt de shell via:

$ export name=hello; echo $name'\t'$name'\t'$name hello\thello\thello

Se o eco for alterado para echo -e , a saída terá guias:

$ export name=hello; echo -e $name'\t'$name'\t'$name hello hello hello

A partir da página man no echo:

-e enable interpretation of backslash escapes

If -e is in effect, the following sequences are recognized:

  \     backslash

  \a     alert (BEL)

  \b     backspace

  \c     produce no further output

  \e     escape

  \f     form feed

  \n     new line

  \r     carriage return

  \t     horizontal tab

  \v     vertical tab
    
por 16.06.2017 / 17:31
1

Veja a página bash(1) man na seção Comandos BuiltIn. A opção -e é necessária para que echo interprete caracteres de escape.

    
por 16.06.2017 / 17:33
1

O seu shell interativo é bash ou algo totalmente diferente? echo é notoriamente não-portável sobre como ele lida com vazamentos de caracteres especiais, como \t . No bash, o echo simples não os expande, mas em p. zsh , parece.

$ zsh  -c 'echo "foo\tbar"'
foo     bar
$ bash -c 'echo "foo\tbar"'
foo\tbar

Bash's echo -e e zsh's echo -E invertem o comportamento acima.

Além disso, você provavelmente quer colocar essas variáveis entre aspas :

#/bin/bash
echo -e "$name\t$pftot\t$etc..."

É claro que a solução portátil seria printf :

printf "%s\t%s\t%s..." "$name" "$pftot" "$..."

Mas não é difícil ver por que alguém iria querer usar echo .

    
por 16.06.2017 / 18:47