我正在使用以下脚本。当我有如下所示的echo $f
时,它会给出正确的结果:
#/bin/bash
var="\/home\/"
while read p; do
f=$(echo $p | sed "s/${var}/\\n/g")
f=${f%.sliced.bam}.fastq
echo $f
~/bin/samtools view $p | awk '{print "@"$1"\n"$10"\n+\n"$11}' > $f
./run.sh $f ${f%.fastq}
rm ${f%.sliced.bam}.fastq
done < $1
我按预期获得输出
test.fastq
但awk > $f
创建的文件名称为
?test.fastq
请注意,这里的总体目标是在具有绝对路径的文件中列出的每个文件上运行此循环,然后在本地写入(这就是sed调用的目的)
编辑:直接在命令行上运行(没有变量)samtools | awk
行正确运行。
答案 0 :(得分:2)
Awk不可能与您的问题有任何关系。 shell完全负责文件重定向,所以f必须有一个奇怪的字符。
最有可能发送到此脚本的任何内容都包含特殊字符(例如,可能是UTF字符,并且您的终端仅显示ASCII)。当你执行echo时,shell不知道如何显示char,并且可能只是将它显示为空格,当你通过ls发送它时(可能是像着色一样)它以奇怪的方式结束并结束向上显示?。
哦等等......你为什么要用sed把文件名换行?这可能是你的问题......试试吧:
sed "s/${var}//g"