2012-10-04 33 views
0

編程初學者在這裏需要一些幫助修改AWK腳本以使其具備條件。另一種非awk解決方案也非常受歡迎。awk有條件地過濾一個基於另一個文件(或其他解決方案)的文件

備註主要過濾功能現在可以在Birei的幫助下工作,但我還有一個額外的問題,詳情請參閱下面的註釋。

我有一系列的輸入文件的3列像這樣:

chr4 190499999 190999999 
chr6 61999999 62499999 
chr1 145499999 145999999 

我想用這些行來過濾其他文件(refGene.txt),如果在文件中的一個行符合項目在一排refGene.txt,將refGene.txt中的第13列輸出到一個新文件'ListofGenes_ $ f'。 對我來說,棘手的部分是,只要第一列(例如'chr4','chr6','chr1')和第二列的AND/OR列3與refGene中的等價列匹配,我希望它被視爲匹配.txt文件。兩個文件之間的等效列是$ 1 = $ 3,$ 2 = $ 5,$ 3 = $ 6。 然後,我不知道在AWK如何不打印從refGene.txt整行,但僅列13

注意我已經實現得益於上述從Birei幫助有條件的篩選。現在我需要加入一個額外的過濾條件。如果$ 2和$ 3之間的任何區域與refGene.txt文件中$ 5和$ 6之間的區域重疊,我還需要從refGene.txt文件輸出$ 13列。這似乎更加棘手,因爲它涉及數學計算以查看區域是否重疊。

我至今腳本:

FILES=/files/*txt 
for f in $FILES ; 
do 

    awk ' 
     BEGIN { 
      FS = "\t"; 
     } 
     FILENAME == ARGV[1] { 
      pair[ $1, $2, $3 ] = 1; 
      next; 
     } 
     { 
      if (pair[ $3, $5, $6 ] == 1) { 
       print $13; 
      } 
     } 
    ' $(basename $f) /files/refGene.txt > /files/results/$(basename $f) ; 
done 

任何幫助非常感謝。非常感謝!

Rubal

回答

1

單程。

awk ' 
    BEGIN { FS = "\t"; } 

    ## Save third, fifth and seventh field of first file in arguments (refGene.txt) as the key 
    ## to compare later. As value the field to print. 
    FNR == NR { 
     pair[ $3, $5, $6 ] = $13; 
     next; 
    } 

    ## Set the name of the output file. 
    FNR == 1 { 
     output_file = ""; 
     split(ARGV[ARGIND], path, /\//); 
     for (i = 1; i < length(path); i++) { 
      current_file = (output_file ? "/" : "") path[i]; 
     } 
     output_file = output_file "/ListOfGenes_" path[i]; 
    } 

    ## If $1 = $3, $2 = $5 and $3 = $6, print $13 to output file. 
    { 
     if (pair[ $1, $2, $3 ]) { 
      print pair[ $1, $2, $3 ] >output_file; 
     } 
    } 
' refGene.txt /files/rubal/*.txt 
+0

@ user964689:我一見鍾情就明白了這個問題。我編輯了答案。我不完全明白你想如何比較字段,但是代碼是註釋的,所以如果結果接近你正在尋找的解決方案,修改應該不會太難。 – Birei

+0

非常感謝,儘管我意識到我必須添加一個額外的要求,使其更加複雜。我編輯了這個問題來反映這一點。如果你能幫上忙,那就太棒了。謝謝。 – user964689

相關問題