【发布时间】:2012-04-20 22:01:24
【问题描述】:
我正在尝试设计一个 awk 命令来选择具有值列 2 的行,该值列在通过将行的特定列配对在一起定义的值范围内。它可用于调用不在外显子边界 50 个核苷酸内的单核苷酸多态性。该文件如下所示:
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
对于该行上的任何“开始”和“结束”配对(配对仅由彼此相邻的“开始”和“结束”列组成),即介于 ($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} }'
谢谢
【问题讨论】:
-
你永远不会改变
a和b的值:else {a+=2; b+=2},我会把循环写成while (a < NF)。注意a和$a之间的区别——a是一个变量(就像在 C 中一样),所以当单独使用时只指它的值;$a首先替换值 然后 返回该字段编号的值(例如:a=2; print a, $a将在第一行返回2 X -
另外,awk 不在 while 循环中使用
do关键字。
标签: awk