如何在for循环中生成多个输出文件

时间:2015-03-12 21:44:12

标签: bash loops for-loop

我是bash的新手,所以这是一个非常基本的问题: 我正在尝试使用下面写的$ for循环为目录中的多个文件执行一系列命令,这些命令应以每个文件的新输出(f:r.bw)结尾。
基本上,我有chr1.gzchr2.gz等文件,最终应该是chr1.bwchr2.bw ... 它现在的方式,它似乎不断覆盖相同的输出文件,我无法弄清楚正确的语法是什么。

$ for file in *.gz
do
zcat < $file | grep -v ^track > f:r.temp
wigToBigWig -clip -fixedSummaries -keepAllChromosomes f:r.temp hg19.chrom.sizes f:r.bw
rm f:r.temp
done

感谢您的帮助

1 个答案:

答案 0 :(得分:2)

不使用固定文件名f:r.temp,而是将目的地名称设在$file上:

for file in *.gz; do
  zcat <"$file" | grep -v '^track' >"${file%.gz}.temp"
  wigToBigWig -clip -fixedSummaries -keepAllChromosomes \
    "${file%.gz}.temp" hg19.chrom.sizes "${file%.gz}.bw"
  rm -f "${file%.gz}.temp"
done

${file%.gz}parameter expansion操作,会在名称末尾修剪.gz;因此,${file%.gz}.bw会修剪.gz并添加.bw


更好的是,如果wigToBigWig不需要真正的(可搜索的)输入文件,您可以直接向zcat | grep进程提供管道,而不需要任何临时文件:

for file in *.gz; do
  wigToBigWig -clip -fixedSummaries -keepAllChromosomes \
    <(zcat <"$file" | grep -v '^track') \
    hg19.chrom.sizes \
    "${file%.gz}.bw"
done