【问题标题】:Looping over two sets of files循环遍历两组文件
【发布时间】:2017-03-23 21:10:17
【问题描述】:

我有一组具有以下扩展名的文件

  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 等等。

【问题讨论】:

  • 请标记您使用的语言

标签: bash loops for-loop awk


【解决方案1】:

由于每个 .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

【讨论】:

    【解决方案2】:

    假设您的文件是按字母顺序排列的并且没有以空格字符命名,您可以使用 columns 和这样的 while 循环:

    ls | columns -c2 | while read cod_fa fa; do 
        prank -convert -d=$fa -dna=$cod_fa -o=A.alignment -keep
    done
    

    您最好先在 prank 前面使用 echo 来测试循环。

    【讨论】:

    • 谢谢雷神,但这只是一个示例,文件根本不按字母顺序排列,所以不确定它是否适用于我的情况。
    • @Paul:好的,那么您需要更准确地了解需求。或许阅读MCVE 关于示例。
    • @Paul:提到的字母假设只要求.fa_cod.fa 文件命名相同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2016-07-17
    • 2023-03-20
    相关资源
    最近更新 更多