我有一组扩展名为
的文件 A.fa
A_cod.fa
B.fa
B_cod.fa
C.fa
C_cod.fa
D.fa
D_cod.fa
对于每个文件,我必须将其作为
prank -convert -d=A.fa -dna=A_cod.fa -o=A.alignment -keep
我想循环遍历文件集并执行上述操作而不是每个文件并尝试:
for f in *.fa and for f1 in *_cod.fa; do prank -convert -d=$f -dna=$f1 -o=$f.alignment -keep; done ;
但这不起作用。因此,对于每个文件,A -d应该读入.fa文件,而-dna应该读取相应的_cod.fa文件,同时读取B,依此类推。
答案 0 :(得分:2)
由于每个.fa文件都有一个_cod.fa文件,我们可以使用一个Bash循环执行此操作:
#!/bin/bash
for f in *.fa; do
[[ "${f/*_/}" = "cod.fa" ]] && continue # skip *_cod.fa files
cod_file="${f//.fa}_cod.fa"
[[ ! -f "$cod_file" ]] && continue # _cod.fa doesn't exist
prank -convert -d="$f" -dna="$cod_file" -o="$f.alignment" -keep
done
答案 1 :(得分:1)
假设您的文件按字母顺序排列且未使用空白字符命名,则可以使用columns
和while循环,如下所示:
ls | columns -c2 | while read cod_fa fa; do
prank -convert -d=$fa -dna=$cod_fa -o=A.alignment -keep
done
您最好首先使用prank
前面的回声测试循环。