我很少使用UNIX,所以如果这看起来像一个简单的问题我会道歉。我试图遍历子目录和文件,然后从循环抓取的特定文件生成输出,然后将输出通过管道传输到另一个目录中的文件,该目录的名称将从输入文件中识别。我到目前为止:
for file in /home/sub_directory1/samples/SSTC*/
do
samtools depth -r chr9:218026635-21994999 < $file > /home/sub_directory_2/level_2/${file}_out
done
我希望在sub_directory1 / samples / SSTC * /中生成file_1_novoalign.bam的输出,并将该输出作为名为file_1_novoalign_out.bam的输出文件发送到/ home / sub_directory_2 / level_2 /但是它不起作用 - 它说'bash:/home/sub_directory_2/level_2/file_1_novoalign.bam.out:没有这样的文件或目录'。
我希望能够剥离outfile的'_novoalign.bam'部分并替换为'_out.txt'。我相信对于普通的unix用户来说这很容易,但是我已经搜索过,找不到快速的答案而且没有时间花时间搜索。提前感谢您对我所拥有的代码构建的任何建议,或者欢迎任何其他建议。
P.S。我无权将文件写入包含输入文件夹的目录
答案 0 :(得分:1)
在没有空格的文件名解释之下,保持简单
如果您需要文件而不是目录,则应使用*
而不是*/
结束for循环。
当您只想处理以_novoalign.bam
结尾的文件时,您应该告诉它为unix。
最简单的方法是使用sed用sed替换字符串的一部分。
美元符号用于字符串的结尾。总脚本将是
OUTDIR=/home/sub_directory_2/level_2
for file in /home/sub_directory1/samples/SSTC/*_novoalign.bam; do
echo Debug: Inputfile including path: ${file}
OUTPUTFILE=$(basename $file | sed -e 's/_novoalign.bam$/_out.txt/')
echo Debug: Outputfile without path: ${OUTPUTFILE}
samtools depth -r chr9:218026635-21994999 < ${file} > ${OUTDIR}/${OUTPUTFILE}
done
注1: 您可以使用file = $ {fullfile ## * /}之类的参数扩展来获取没有路径的文件名,但是您将在一小时内忘记语法。 更容易记住的是basename和dirname,但你仍然需要进行一些处理。
注2:
当您的脚本首次将目录更改为/ home / sub_directory_2 / level_2时,您可以跳过基本名称调用
当要处理目录中的所有文件时,您可以使用星号
当所有文件最多只有一个下划线时,您可以使用剪切。
您可能想要添加一些错误处理。如果您想在输出文件中使用samtools中的STDERR,请添加2>&1
这些将把你的脚本变成
OUTDIR=/home/sub_directory_2/level_2
cd /home/sub_directory1/samples/SSTC
for file in *; do
echo Debug: Inputfile: ${file}
OUTPUTFILE="$(basename $file | cut -d_ -f1)_out.txt"
echo Debug: Outputfile: ${OUTPUTFILE}
samtools depth -r chr9:218026635-21994999 < ${file} > ${OUTDIR}/${OUTPUTFILE} 2>&1
done