【问题标题】:unix for loop modify the output filenameunix for循环修改输出文件名
【发布时间】:2017-08-08 08:57:49
【问题描述】:

我在一个文件名以fastq.gz 结尾的目录中工作。使用如下循环,我将运行一个工具。

for i inls; do if [[ "$i" == *".gz" ]]; then bwa aln ../hg38.fa $i > $i | sed 's/fastq.gz/sai/g'; fi; done

我的问题是,我希望我的输出文件名以 .sai 而不是 fastq.gz 结尾,并保持文件名的其余部分相同。然而,当它在> 之后第一次看到$i 时,它会修改输入文件本身。我尝试像<($i | sed 's/fastq.gz/sai/g') 一样使用它,但这也不起作用。写这个的正确方法是什么?

【问题讨论】:

    标签: bash unix for-loop


    【解决方案1】:

    您可以使用字符串替换来计算文件名和扩展名。 此外,您不应依赖 ls 输出,而应直接在您要查找的表达式上循环。

     for file in *.gz; do
       name="${file%.*}"
       file_output="${name}.sai"
       bwa aln ../hg38.fa ${file} > ${file_output}
     done
    

    【讨论】:

    • 这是一个很好的方法,可以解决我的问题,谢谢。只是出于好奇,您是否还知道如何在 $i 上优先使用 sed 并获得问题中修改后的 $i?
    • 好吧,因为它是一个脚本,所以我将始终分几个步骤进行操作,您不需要压缩它,但您可以这样做:CMD > $(echo $file | sed 's/fastq.gz/sai/g')
    猜你喜欢
    • 2016-04-25
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 1970-01-01
    • 2015-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多