我是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
感谢您的帮助
答案 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