我有一组数据,如下所示:
NK.Chr1:75500000-95000000:28960-29007 NG-unitig0655 97.872 47 1 0 1 47 121009 120963 2.90e-14 80.6
NK.Chr1:75500000-95000000:28960-29007 NG-1DRT-unitig0549 97.872 47 1 0 1 47 623680 623726 2.90e-14 80.6
NK.Chr1:75500000-95000000:28960-29007 NG-1DRT-unitig0278 97.872 47 1 0 1 47 1224581 1224627 2.90e-14 80.6
NK.Chr1:75500000-95000000:28960-29007 NG-1DRT-Chr4 97.872 47 1 0 1 47 8416368 8416414 2.90e-14 80.6
NK.Chr1:75500000-95000000:28960-29007 NG-1DRT-Chr4 97.872 47 1 0 1 47 20041035 20041081 2.90e-14 80.6
NK.Chr1:75500000-95000000:28960-29007 NG-1DRT-Chr4 97.872 47 1 0 1 47 35175472 35175426 2.90e-14 80.6
NK.Chr1:75500000-95000000:28960-29007 NG-1DRT-Chr4 97.872 47 1 0 1 47 56460095 56460049 2.90e-14 80.6
我需要过滤0-3900000范围内的行,只考虑NG之前的数字。
grep 'NK.Chr1:75500000-95000000:[0-3900000]' NG.1DRT-blast.out > chr1-blast-NG.txt
我尝试了这个代码,但它返回了所有带有NK.Chr1:75500000-95000000
的行,没有考虑范围。
有人知道如何为它构建合适的代码吗?
使用您显示的示例和尝试,请尝试以下awk
代码。用GNUawk
编写和测试。
awk ' match($0,/NK.Chr1:75500000-95000000:([0-9]+)-([0-9]+)[[:space:]]+NG/,arr) && int(arr[1] arr[2])<=3900000' Input_file
OR
awk 'match($0,/NK.Chr1:75500000-95000000:([0-9]+)-([0-9]+)[[:space:]]+NG/,arr) && (arr[1] arr[2])+0<=3900000' Input_file
解释:
在这里使用awk
的match
函数,其中使用类似于正则表达式的:NK.Chr1:75500000-95000000:([0-9]+)-([0-9]+)[[:space:]]+NG
,它创建了两个捕获组,这些捕获组的值将进一步存储到名为arr的数组中。然后,如果数字的值(通过删除它们之间的-
(小于或等于3900000,则向match
添加AND条件,然后打印该行。