スクリプトを使用するかコードを貼り付けるときの異なる結果

スクリプトを使用するかコードを貼り付けるときの異なる結果

私は私のファイルで算術演算を実行し、データ行列をanalyze.txt(ヘッダーが追加されました)にエクスポートするいくつかのUnixコードを書きました。ただし、このコードをスクリプトに入れてスクリプトを実行しようとすると、実際のスペースの代わりにタブ(\ t)で列が区切られます。

有効なコード:

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

動作しないコード:

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

走る:

bash Analysis.sh

リテラル "\t" 区切り文字を使用して、最後にエコーされた行の変数を印刷します。

私は初心者なので、アドバイスや資料をいただきありがとうございます。

答え1

この行は:

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

直接挿入されます\t。以下を使用して、シェルプロンプトで次の内容を表示できます。

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

echo を次に変更すると、echo -eタブが出力に含まれます。

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

echoのマニュアルページから:

-e バックスラッシュエスケープ解析を可能にします。

-eが適用されると、次のシーケンスが認識されます。

  \\     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

答え2

bash(1)組み込みコマンドセクションのマニュアルページを参照してください。このオプションはエスケープ文字を解釈するために-e必要です。echo

答え3

インタラクティブシェルはbash完成しましたか?それとも別のものがありますか?echo携帯性がないことが知られている\tたとえば、bashは通常の文字エスケープを処理する方法をecho拡張しませんが、たとえばではzsh拡張するようです。

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

Bashecho -eとzshはecho -E上記の動作を逆にします。

また、次のこともできます。この変数を引用符で囲みます。:

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

もちろん、ポータブルソリューションは次のとおりですprintf

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

しかし、なぜ人々がそれを使用したいのかを知るのは難しくありませんecho

関連情報