【问题标题】:How can I generate multiple output files in for loop如何在 for 循环中生成多个输出文件
【发布时间】:2015-03-12 21:44:11
【问题描述】:

我是 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

感谢您的帮助

【问题讨论】:

    标签: bash loops for-loop


    【解决方案1】:

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

    【讨论】:

    • 谢谢!我尝试了上面的建议,它正在工作!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2014-07-29
    • 2017-12-21
    • 2016-06-24
    相关资源
    最近更新 更多