2014-02-08 31 views
0

我有一個包含以下幾列的輸入文件:猛砸提取物最後n個字符,比較分離柱

'-' CT C>CCT 
'-' TA G>GTA 
'-' TAT A>ATAT 

基本上,我想測試箭頭後的最終n個字符的第3列是否與第2列的內容相同,其中n是箭頭前後字母之間的長度差異。

看來,我迄今爲止試過的所有東西都引發了一個錯誤。我在想以下幾行:

awk -F"\t" '{split($3,x,">"); 
{n_base=length(x[2])-length(x[1]); 
ins={$x[2]: -$n_base}; 
if($2 == $ins) {print $0}}' 

有什麼想法?

在此先感謝。

+0

'插件= {$ x [2]: - $ n_base}'是一個shell語言結構。 awk不是shell,awk是一個可以從shell調用的工具,就像'cut','grep'等一樣。另外,通過命名變量來獲得awk變量的值,就像在C中一樣,而不是通過粘貼在它前面的'$'就像你在shell中做的一樣。獲得Arnold Robbins編寫的「Effective Awk Programming,Third Edition」一書。 –

回答

1

你沒有表現出任何樣本輸出,所以這是一個猜測,但它聽起來就像你想要的是:

$ awk -F'[\t>]' '$2==substr($4,length($3)+1)' file 
'-'  CT  C>CCT 
'-'  TA  G>GTA 
'-'  TAT  A>ATAT 
+1

並感謝您的指點! – user2232814

0

我認爲這會做你想要什麼:

awk -F'\t' ' 
     { 
      split($3, parts, ">"); 
      fl = length(parts[2]) 
      check = substr(parts[2], fl-length($2)+1) 
     } 

     $2 == check {print} 
     ' 
+2

分裂的第三個參數是RE。通過不使用RE分隔符'/.../',您告訴awk您的RE在一個字符串內部,這會導致它被解析兩次,一次是腳本被讀取,另一次是被執行。這對你現在使用的單個字符無關緊要,但對於其他分隔符會導致很多不必要的雙重轉義RE元字符。只要使用RE分隔符,除非你有一個非特定的原因(例如,將字符串字面值與一個變量連接):'split($ 3,parts,/> /)'。 –

+0

另外,在最終條件之後,因爲這是默認操作,所以會丟失僞隨機分號並且不需要{{print}'。 –