UNIX如何使用输入文件的基础作为输出文件的一部分

时间:2015-02-10 14:46:54

标签: unix file-io output file-moving

我很少使用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。我无权将文件写入包含输入文件夹的目录

1 个答案:

答案 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