我在两个单独的目录中有一系列文件,我希望彼此匹配。命名法看起来像这样:
转发目录: 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
不幸的是,这对我不起作用,可能是因为我的文件没有相同的基本名称。有人可以给我一个建议吗?我在这里非常新手。
答案 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