匹配指定列范围包含点字符的行,如果找到8次或更多图案,则不打印该行

时间:2012-07-24 15:01:51

标签: regex linux awk

我有一个制表符分隔文件,其中从第10-25列开始,某些值包含“。”字符。我想过滤掉与“。”匹配的行。在该列列范围内的字符,如果在列10-25中发现少于8x次(即少于50%出现),则不打印。

我已经尝试过查看类似的帖子,而我最接近的是用户:lodge(Match lines with pattern n times in the same line)然而,当我尝试了一些命令时,它的行为并不像我需要的那样

例如,下面的代码用点替换了所有内容......虽然我知道这是因为它是一个全局替换,但似乎适用于lodge。

    awk '{ if (gsub(/./, ".") >= 8) print }' merged.vcf > test.vcf 

以下是我的文件示例(本例中我只包括第11列):

    #CHROM  POS  ID  REF ALT QUAL    FILTER  INFO    FORMAT  AD0062-C AD0065-C
      2L     560 .   T   C   30.65   PASS    AC=3    GT:GQ:PL    .       .
      2L     595 .   G   T   61.75   PASS    AC=11   GT:GQ:PL    .   0/1:13:132,0,10 

1 个答案:

答案 0 :(得分:4)

如果要检查列10 - 25是否正好.,请执行:

awk '{c=0; for( i = 10; i <= 25; i++ ) c += $i ~ /^\.$/;
    if( c >= 8 ) print }' input

如果您只关心这些列包含.,请忽略^$