Regex 正则表达式匹配尽可能多的字符串

Regex 正则表达式匹配尽可能多的字符串,regex,string,awk,grep,Regex,String,Awk,Grep,我不知道这是否可行或有意义,但我尝试做的是grep或awk一个匹配多个字符串的文件,但只显示匹配最多字符串的匹配 因此,我会有一个类似以下的文件: cat,dog,apple,bark,chair apple,chair,wall cat,wall phone,key,bark,nut cat,dog,key phone,dog,key table,key,chair 我想匹配一行,其中包含大多数字符串:cat | dog | table | key | wall。不一定要包括所有内容,但无论

我不知道这是否可行或有意义,但我尝试做的是
grep
awk
一个匹配多个字符串的文件,但只显示匹配最多字符串的匹配

因此,我会有一个类似以下的文件:

cat,dog,apple,bark,chair
apple,chair,wall
cat,wall
phone,key,bark,nut
cat,dog,key
phone,dog,key
table,key,chair
我想匹配一行,其中包含大多数字符串:
cat | dog | table | key | wall
。不一定要包括所有内容,但无论哪一行最匹配,都要打印出来

例如,我希望它显示以下输出:

cat,dog,key
因为它是包含正在搜索的大多数字符串的行

我试过使用:

cat filename \
|egrep -iE 'cat' \
|egrep -iE 'dog' \
|egrep -iE 'table' \
|egrep -iE 'key' \
|egrep -iE 'wall'
但它只会显示显示所有字符串的行,我也尝试过:

egrep -iE 'cat|dog|table|key|wall' filename
但这会显示与这些字符串中任何一个匹配的任何行


regex可以做这样的事情吗

使用
awk
,并为匹配的每个单词增加一个计数器。如果计数器高于最高计数,则保存此行

awk 'BEGIN {max = 0}
     { count=0;
       if (/\bcat\b/) count++;
       if (/\bdog\b/) count++;
       ...
       if (count > max) { saved = $0; max = count; }
     }
    END { print saved; }'
$awk-F,-vr='^(cat | dog | table | key | wall)$'{c=0;for(i=1;imax){max=c;most=$0}END{print most}文件
猫、狗、钥匙
工作原理
  • -F,

    这将字段分隔符设置为逗号

  • -vr='^(猫|狗|桌|键|墙)$”

    这将变量
    r
    设置为与您感兴趣的单词匹配的正则表达式。正则表达式以
    ^
    开头,以
    $
    结尾。这样可以确保只匹配整个单词

  • c=0;对于(i=1;imax){max=c;most=$0}

    如果当前行
    c
    上的匹配数超过先前的最大值
    max
    ,则更新
    max
    ,并将
    most
    设置为当前行

  • END{print most}

    读取完文件后,打印与
    most
    匹配的行


为了使问题更有趣,我创建了两个输入文件:

填充1

cat|dog|table|key|wall
填充2

cat,dog,apple,bark,chair
apple,chair,wall
cat,wall phone,key,bark,nut
cat,dog,key
phone,dog,key
table,key,chair
请注意,InFile2与原始帖子不同 因为它包含两行,每行有三个匹配项。 因此,第一名和第二名之间存在“平局” 报道

此代码

 awk -F, '{if (NR==FNR) r=$0; else {count=0
   for (j=1;j<=NF;j++) if ($j ~ r) count++
   a[FNR]=count" matching words in "$0
   if (max<count) max=count}}                     
   END{for (j=1;j<=FNR;j++) if (1==index(a[j],max)) print a[j]}'  \
$InFile1 $InFile2 >$OutFile

Daniel B.Martin

使用正则表达式是不可能的,但您可以编写一个简单的AWK脚本来完成它。将
cat
match
catch
?也可以!谢谢你的解释!你太棒了!很好的解决方案。如果重复一个单词,我们的两种解决方案会有所不同:我的计算一次,这个每次都计算一次。你可以在
BEGIN
块中分配它。它实际上起到了作用。在末尾添加时,我只是忘了在“再次感谢您的帮助!
 awk -F, '{if (NR==FNR) r=$0; else {count=0
   for (j=1;j<=NF;j++) if ($j ~ r) count++
   a[FNR]=count" matching words in "$0
   if (max<count) max=count}}                     
   END{for (j=1;j<=FNR;j++) if (1==index(a[j],max)) print a[j]}'  \
$InFile1 $InFile2 >$OutFile
3 matching words in cat,dog,key
3 matching words in table,key,dog,banana