2012-04-20 73 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