Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在两组文件上循环_Bash_Loops_For Loop_Awk - Fatal编程技术网

Bash 在两组文件上循环

Bash 在两组文件上循环,bash,loops,for-loop,awk,Bash,Loops,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 -

我有一组扩展名如下的文件

  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也应该读入,依此类推。

因为每个.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

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

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

您最好先在
恶作剧
前面用回音测试循环。

请标记您使用的语言。谢谢Thor,但这只是一个示例,文件根本不是字母顺序,所以我不确定它是否适用于我的情况。@Paul:好的,那么您需要更准确地了解要求。也许可以阅读关于示例的内容。@Paul:前面提到的字母顺序假设只要求
.fa
\u cod.fa
文件的名称相同。