【问题标题】:match lines where a specified column range contains dot character and do not print the line if the pattern is found 8 times or more匹配指定列范围包含点字符的行,如果找到该模式 8 次或更多次,则不打印该行
【发布时间】:2012-07-24 23:45:31
【问题描述】:

我有一个制表符分隔的文件,其中从第 10-25 列开始,一些值包含“。”特点。我想过滤掉与“。”匹配的行。字符,在此列的列范围内,以便如果在第 10-25 列中找到少于 8 次(即出现少于 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 

【问题讨论】:

  • 你就不能逃避点吗?

标签: regex linux awk


【解决方案1】:

如果您想检查第 10 - 25 列是否正好是 .,请执行以下操作:

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

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

【讨论】:

  • 非常感谢威廉...我意识到标题问题和我的问题是矛盾的。如果发现点是 8 倍或更多,而实际上我的意思正好相反,我就输入了 print。无论如何,我现在已经修改了,我只是将您的代码调整为 c
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2017-02-15
  • 1970-01-01
  • 2011-09-23
  • 1970-01-01
相关资源
最近更新 更多