私は私のファイルで算術演算を実行し、データ行列を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
。