【问题标题】:Matching two files via a for loop (Bash)通过 for 循环匹配两个文件(Bash)
【发布时间】:2014-07-07 13:13:56
【问题描述】:

我在两个单独的目录中有一系列文件,我想相互匹配。命名法如下所示:

转发目录: 1_A_R1_Paired.gz, 1_B_R1_Paired.gz, 2_A_R1_Paired.gz, 2_B_R1_Paired.gz 等等

反向目录: 1_A_R2_Paired.gz, 1_B_R2_Paired.gz, 2_A_R2_Paired.gz, 2_B_R2_Paired.gz 等等

我想设置我的 for 循环,以便我的命令仅在匹配的文件 R1 和 R2 上执行,结果将是:

my_command 1_A_R1_Paired.gz 1_A_R2_Paired.gz > 1_A_R1R2.bam

但不是:

my_command 1_A_R1_Paired.gz 1_B_R2_Paired.gz > 1_AB_R1R2.bam

其他人在这里遇到了类似的问题:bash: for loop, two variables linked。该解决方案是:

for f in dir1/*.fq; do
    b=$(basename "$f")
    f2=dir2/"$b".sa
    if test -f "$f2"; then
        mycommand "$f2" "$f" >"$b".sa.cc
    fi
done

不幸的是,这对我不起作用,可能是因为我的文件没有相同的基本名称。有人可以给我一个建议吗?我是这里的新手。

【问题讨论】:

    标签: bash file for-loop


    【解决方案1】:

    如果两个文件的基本名称不完全匹配,您可以更改要查找的文件的名称,例如使用sed

    解决方案可能如下所示:

    for f in dir1/*.qz; do
        b=$(basename "$f")
        f2=`sed s/R1/R2/ <<< "dir2/$b.gz"`
        if test -f "$f2"; then
            mycommand "$f" "$f2" > "$b".sa.cc
        fi
    done
    

    注意sed 命令应该适应你的模式,现在它只是用R2 替换第一个R1

    【讨论】:

    • 这个解决方案也有效,虽然我不太确定为什么,因为我不太清楚 sed 的用法。
    【解决方案2】:

    要获取对,首先获取前缀和后缀:

    for file in *R1*.gz
    do
        prefix="${file%R1*}"
        suffix="${file#*R1}"
        if [ -f "${prefix}R2${suffix}" ]
        then
            my_command "${prefix}R1${suffix}" "${prefix}R2${suffix}" > "1_A_R1R2.bam"
        fi
    done
    

    【讨论】:

    • 这很好,一旦我理清了我是个白痴的事实。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2019-01-25
    • 2020-08-18
    • 2014-12-03
    • 1970-01-01
    • 2013-01-09
    相关资源
    最近更新 更多