使用脚本或粘贴代码时的不同结果

使用脚本或粘贴代码时的不同结果

我编写了一些unix代码,对我的文件执行算术并将数据矩阵吐出到analysis.txt中(带有添加的标头)。但是,当我尝试将此代码放入脚本并运行该脚本时,制表符 (\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直接插入。人们可以通过以下方式从 shell 提示符中看到类似的内容:

$ 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

您的交互式 shell 是bash完全的还是其他的?echo众所周知是不可携带的关于它如何处理特殊字符转义,例如\t.在 bash 中, plainecho不会扩展它们,但在 eg 中zsh,似乎会扩展它们。

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

Bashecho -e和 zshecho -E反转了上述行为。

另外,您可能想要将这些变量放在引号内

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

当然,便携式解决方案是printf

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

但不难理解为什么人们想要使用echo它。

相关内容