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

Regex 匹配指定列范围包含点字符的行,如果发现图案8次或更多次,则不打印该行,regex,linux,awk,Regex,Linux,Awk,我有一个以制表符分隔的文件,其中从第10-25列开始,一些值包含“.”字符。我想筛选出在此列范围内与“.”字符匹配的行,以便在第10-25列中发现少于8x次(即少于50%的出现率)时不会打印 我试过查看类似的帖子,最接近的是用户:lodge(),但是,当我尝试一些命令时,它的行为并不是我需要的 例如,下面的代码将所有内容替换为一个点…虽然我知道这是因为它是一个全局替换,但它似乎对lodge有效 awk '{ if (gsub(/./, ".") >= 8) print }' mer

我有一个以制表符分隔的文件,其中从第10-25列开始,一些值包含“.”字符。我想筛选出在此列范围内与“.”字符匹配的行,以便在第10-25列中发现少于8x次(即少于50%的出现率)时不会打印

我试过查看类似的帖子,最接近的是用户:lodge(),但是,当我尝试一些命令时,它的行为并不是我需要的

例如,下面的代码将所有内容替换为一个点…虽然我知道这是因为它是一个全局替换,但它似乎对lodge有效

    awk '{ if (gsub(/./, ".") >= 8) print }' merged.vcf > test.vcf 
下面是我的文件的一个示例(在这个示例中,我最多只包括第11列):


如果要检查第10列至第25列是否完全符合
,请执行以下操作:

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

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

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

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

如果您只关心那些列包含一个
,请忽略
^
$

您就不能跳过点吗?您就不能跳过点吗?非常感谢william。。。我意识到标题问题和我的问题是矛盾的。如果发现点是8倍或更多,我就键入print,而实际上我的意思是相反的。不管怎样,我现在已经修改了,我只是简单地修改了你的代码来适应cThanks很多william。。。我意识到标题问题和我的问题是矛盾的。如果发现点是8倍或更多,我就键入print,而实际上我的意思是相反的。不管怎样,我现在已经修改了,我只是将您的代码改编成c