如何执行循环搜索awk中的几个文件中包含的字符串并打印新文件?

时间:2016-05-16 23:30:00

标签: bash for-loop awk

我有这个代码来获取条目列表的几个序列。这将匹配每个列表(如OMA999.fas)与序列(sequences.fa)

的大文件
awk 'NR==1{printf $0"\t";next}{printf /^>/ ? "\n"$0"\t" : $0}' sequences.fa | awk -F"\t" 'BEGIN{while((getline k <"OMA999.fas")>0)i[k]=1}{gsub("^>","",$0); if(i[$1]){print ">"$1"\n"$2}}'

此代码工作正常。现在我需要一个循环,我尝试了以下代码,但似乎它不匹配任何字符串。我不知道for循环的结构是否错误,但我认为它调用 getline k < "$file" 的部分正在工作。

for file in *.fas; do awk 'NR==1{printf $0"\t";next}{printf /^>/ ? "\n"$0"\t" : $0}' sequences.fa | awk -F"\t" 'BEGIN{while((getline k < "$file")>0)i[k]=1}{gsub("^>","",$0); if(i[$1]){print ">"$1"\n"$2}}' > $(basename $file).nuc; done

我必须补充一点,第一个代码将文件重命名为OMA999.fas.nuc,其序列与OMA文件中的行一样多。现在我想要一个循环后的.nuc文件列表。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的awk脚本包含在单引号' ... '中。这意味着bash不会执行变量扩展,$file将被视为字符串$ -f-i-l-e,而不是for循环中的变量。将其更改为双引号可能会工作,或者它可能只会让您感到痛苦,因为shell也会尝试扩展awk变量。这里有一些关于如何最好地做到这一点的文档。 https://www.gnu.org/software/gawk/manual/html_node/Using-Shell-Variables.html

其他说明:

  • 我不太了解awk对您的awk脚本发表评论,而且我并不完全确定您正在尝试做什么,但我有这种预感,您的awk脚本过于复杂。
  • 您要搜索的字符串不会更改,因此您不需要在每次循环迭代时重新读取它们。如果你没有做太多的工作就不会受到伤害,但如果你这样做,那就应该进行优化。