【问题标题】:Add unique Output files names with loop in linux/bash在 linux/bash 中使用循环添加唯一的输出文件名
【发布时间】:2022-11-18 04:46:21
【问题描述】:

我有 96 个 bam 文件,如何输出带有唯一样本 ID 的 txt 文件?我正在遍历 bam 文件,但需要分配唯一的输出文件。例如:SC845414.txt

#Typical Bam Files:
SC845414-CTGATCGT-GCGCATAT_Aligned.sortedByCoord.out.bam
SC845425-TGTGACTG-AGCCTATC_Aligned.sortedByCoord.out.bam

#!/bin/bash
#SBATCH --mem=110g
#SBATCH --cpus-per-task=12
#SBATCH --time=10-00:00:00

module load python

DIR=/PATH/*

for d in $DIR; do
    python -m HTSeq.scripts.count -s yes -f bam "$d" /PATH1/gencode.v35.annotation.gtf > /PATH3/HTseq/SC845414.txt
done

【问题讨论】:

    标签: linux bash loops


    【解决方案1】:

    这在很大程度上取决于您所说的“样本 ID”的确切含义。

    根据您的示例,如果您的意思是“第一个破折号之前的文件名部分”,那么您可以这样做:

    for d in $DIR; do
        id=$(basename "$d" | cut -f 1 -d -)
        python -m HTSeq.scripts.count -s yes -f bam "$d" /PATH1/gencode.v35.annotation.gtf > "/PATH3/HTseq/$id.txt"
    done
    

    【讨论】:

    • 为什么这个周围有三个“”? “/PATH3/HTseq/$id.txt”而不仅仅是“id”?
    • 您需要 $ 使其成为变量,因此它需要是 $id,而不是 id。出于多种原因,最好引用其中包含变量的任何内容(请参阅here)。好吧,除非你依赖于在引号中不起作用的功能(比如你使用 $DIR,你希望 * 被扩展)。
    • 这就是我得到的:
    • DIR=/P/A/T/T/SC915966-GCGTCATT-CAGACGTT_Aligned.sortedByCoord.out.bam
    • id=$(printf '%s' "$DIR" | cut -f 1 -d -)
    【解决方案2】:

    相同的; 但使用内置变量插值而不是调用 basename 和 cut

    for d in $DIR; do
        fname=${d##/*}
        python -m HTSeq.scripts.count -s yes -f bam "$d" /PATH1/gencode.v35.annotation.gtf > "/PATH3/HTseq/${fname%%-*}.txt"
    done
    

    (也进行了编辑以去除任何主要路径)

    不幸的是,一次剥离变量的前导和尾随部分超出了我的范围(目前)。

    似乎应该可以看到: https://www.thegeekstuff.com/2010/07/bash-string-manipulation/

    (没有隶属关系或背书;只是第一次相关的网络搜索)

    【讨论】:

    • 这是 sh 兼容还是只是 bash?
    • bash 据我所知,tcsh 有一些其他约定,我已经忘记了
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-26
    • 2015-02-02
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多