2016-05-16 26 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' –

相關問題