我有这个代码来获取条目列表的几个序列。这将匹配每个列表(如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文件列表。
感谢您的帮助。
答案 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脚本过于复杂。