如何在for循环中生成多个输出文件
How can I generate multiple output files in for loop
我是 bash 的新手,所以这是一个非常基本的问题:
我正在尝试使用下面编写的 $for 循环对目录中的多个文件执行一系列命令,这应该以每个文件的新输出 (f:r.bw) 结尾。
基本上,我有 chr1.gz
、chr2.gz
等文件,它们最终应该是 chr1.bw
、chr2.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
我是 bash 的新手,所以这是一个非常基本的问题:
我正在尝试使用下面编写的 $for 循环对目录中的多个文件执行一系列命令,这应该以每个文件的新输出 (f:r.bw) 结尾。
基本上,我有 chr1.gz
、chr2.gz
等文件,它们最终应该是 chr1.bw
、chr2.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