2012-04-20 26 views
3

我試圖設計一個awk命令來選擇行值列2,該列值在通過將行的特定列配對在一起而定義的值的範圍內。它在調用不在外顯子邊界的50個核苷酸內的單核苷酸多態性方面具有應用。該文件是這樣的:awk命令從列對中定義的間隔中選擇值

ID X start end start end start end start end 
Fal1825_c6 802 2 62 62 239 239 362 362 934 
Fal1821_c2 152 1 19 22 159 159 263 264 398 
Fal18279_c7 41 1 177 177 598     
Fal18376_c3 367 1 251 251 421     
Fal18748_c2 601 1 152 152 489 489 499 499 677 
Fal18748_c2 500 1 152 152 489 489 499 499 677 
Fal18792_c3 750 1 234 234 459 459 762 762 83 
Fal19487_c2 89 1 177 177 270 270 409 411 459 

我只想打印線,其中第二列的值落在範圍(」開始」 + 50)和(‘結束’ - 50),對於任何‘啓動’ ($ 3 + 50和$ 4-50)或($ 5 + 50和$ 6-50)或(())之間的「結束」配對(配對僅由彼此相鄰的「開始」和「結束」列組成) $ 7 + 50和$ 8-50)等等,考慮組件的所有起始端列。

輸出將如下所示:

ID X start end start end start end start end 
Fal1825_c6 802 2 62 62 239 239 362 362 934 
Fal18376_c3 367 1 251 251 421    
Fal18748_c2 601 1 152 152 489 489 499 499 677 
Fal19487_c2 89 1 177 177 270 270 409 411 459 

我試圖命令看起來像這樣

awk '{a=3; b=4; while ($a > 0) do {if ($2 > ($a + 50) && $2 < ($b + 50)){print $0} else {a+2, b+2} }' 

謝謝

+0

你永遠不會改變的值'a'和'b':'else {a + = 2; b + = 2}',我會把循環寫成while(a 2012-04-20 14:03:32

+0

另外,awk不使用在一個while循環中做''關鍵字。 – 2012-04-20 14:10:41

回答

3

嘗試:

awk '{ 
for (i = 3; i <= NF; i += 2) 
    if ($2 > $i+50 && $2 < $(i+1)-50) { print; next } 
}' FILE 
+0

非常感謝,它工作完美! – Cris 2012-04-22 10:30:11