我编写了一些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
它。