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
文件的名称相同。