如何在Linux上使用-grep构建一个过滤间隔的命令



我有一组数据,如下所示:

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

解释: 在这里使用awkmatch函数,其中使用类似于正则表达式的:NK.Chr1:75500000-95000000:([0-9]+)-([0-9]+)[[:space:]]+NG,它创建了两个捕获组,这些捕获组的值将进一步存储到名为arr的数组中。然后,如果数字的值(通过删除它们之间的-(小于或等于3900000,则向match添加AND条件,然后打印该行。

最新更新