我很抱歉发布此内容但这让我发疯。我是一个非常新的打击脚本,我真的很挣扎。我有以下格式8_S58_L001.sorted.bam的文件,我想从许多文件中取第一个数字(在这种情况下为8)并生成一个csv文件。这将给出下游功能处理样品的顺序。 该脚本如下,它的工作原理,但是每次运行它时都会出现错误(-bash:语法错误接近意外令牌'完成')并且很难理解原因。到目前为止,我花了两天的时间试图找到它的底部,并通过各种论坛进行了广泛的搜索。
do
test=$(ls -LR | grep .bam$| sed 's/_.*//'| awk '{print}' ORS=',' | sed 's/*$//')
echo $test>../SampleOrder/fileOrder2.csv
done
如果我只是跑
test=$(ls -LR | grep .bam$| sed 's/_.*//'| awk '{print}' ORS=',' | sed 's/*$//')
echo $test>../SampleOrder/fileOrder2.csv
然后我得到了所需的输出并且没有错误但是如果它被包含在do语句中我得到了上述错误。我希望将其合并到一个更大的脚本中,所以我想先处理这个错误。
我应该说这是在基于Linux的集群上运行。
有经验的人可以告诉我哪里出错了。
提前致谢
萨姆
答案 0 :(得分:0)
bash没有do
语句,done
是一个保留字,当它是命令中的第一个单词时。
所以在
do
something
something
done
do
是语法错误。 do
仅在for
和while
循环的上下文中有用,它用于将条件与循环体分开。
由于您在done
而不是do
报告语法错误,我的猜测是您已经让Windows行结尾进入您的文件。 Bash不会将\r
( CR )字符视为特殊字符,因此如果您的文件实际包含do\r
,那么这将被视为外部命令的名称
答案 1 :(得分:0)
您应该知道grep .bam$
没有做您期望它做的事情。点是一个grep通配符,匹配任何单个字符,因此模式.bam$
将匹配任何以" bam"结尾的4个或更多字符的字符串。如果您要尝试匹配以" .bam"结尾的所有字符串,则应该转义该点并写入grep "\.bam$"
但正如前一位评论者所说,你应该使用shell通配符(ls *.bam
)而不是grep(ls | grep .bam$
)