2016-05-16 29 views
0

我有这个代码来获取条目列表的几个序列。这匹配每个列表(如OMA999.fas)在一个大文件中的序列(sequences.fa)如何执行循环来搜索awk中几个文件中包含的字符串并打印新文件?

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

我不是很清楚你想要什么。是不是你有一堆模式的文件,你想从该文件中读取这些模式,然后使用这些模式来匹配另一个文件或一系列文件中的行? – Mort

+0

我是用第一个脚本做的。现在我需要一个循环来搜索包含不同模式的一系列文件,并且使用每个搜索的输出返回文件,这将是另一个循环内部的循环。 –

+0

您现有的第一个脚本看起来非常冗余,请发布示例输入/输出文件。 “ – karakfa

回答

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脚本太复杂了。
  • 您正在搜索的字符串没有更改,因此您无需在每次循环迭代中重新读取它们。如果你没有做太多的工作,它不会受到伤害,但如果你是这样的话,那么应该优化它。
+0

”您正在搜索的字符串不会更改,因此您无需在每次循环迭代中重新读取它们。“ 我不明白这一点。这些字符串在每个文件中都是不同的,每个组的形成都是不同的,因为它将来自不同集合的序列分组。 我可以在包含列表的几个文件上运行此脚本,问题是我有87000个文件要搜索的模式。 –

+0

您正在每个循环重读'sequences.fa'。 – Mort

+0

好的,是的,那是我找到字符串和整个记录的地方。因为我需要恢复线加下面像 '>字符串匹配 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA' –

相关问题