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
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
matchcatch
?也可以!谢谢你的解释!你太棒了!很好的解决方案。如果重复一个单词,我们的两种解决方案会有所不同:我的计算一次,这个每次都计算一次。你可以在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