通过for循环匹配两个文件(Bash)

时间:2014-05-19 14:15:10

标签: bash file for-loop

我在两个单独的目录中有一系列文件,我希望彼此匹配。命名法看起来像这样:

转发目录:     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

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

2 个答案:

答案 0 :(得分:0)

如果两个文件的基本名称不完全匹配,则可以更改要查找的文件的名称,例如使用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命令应该适合您的模式,现在只需将第一个R1替换为R2

答案 1 :(得分:0)

要获得对,首先得到前缀和后缀:

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