循环两组文件

时间:2017-03-23 21:10:18

标签: bash for-loop awk

我有一组扩展名为

的文件
  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,依此类推。

2 个答案:

答案 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前面的回声测试循环。