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

How can I generate multiple output files in 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

感谢帮助

不使用固定文件名 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