如何匹配文件中的某些单词并列出该匹配单词的所有行? (没有正则表达式)

Posted

技术标签:

【中文标题】如何匹配文件中的某些单词并列出该匹配单词的所有行? (没有正则表达式)【英文标题】:How to match some words from file and list all the rows of that matching word? (without regex) 【发布时间】:2021-09-04 08:20:07 【问题描述】:

显示在位置名称以ore 结尾的所有员工的员工详细信息

EmpID:Name:Designation:UnitName:Location:DateofJoining:Salary
1001:Thomson:SE:IVS:Mumbai:10-Feb-1999:60000
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1003:Jackson:DM:IMS:Hyderabad:23-Apr-1985:90000
1004:BobGL::ETA:Mumbai:05-Jan-2004:55000
1005:Alice:PA:::26-Aug-2014:25000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000
1007:Kirsten:PM:IMS:Mumbai:26-Aug-2014:45000
1004:BobGL::ETA:Mumbai:05-Jan-2021:55000

预期输出:

1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000

这是我尝试过的代码,它只显示位置,但我想要完整的详细信息

cut -d ":" -f4 employee.txt | grep 'ore\>' 

编辑:已解决

grep "`cut -d ":" -f5 employee.txt | grep 'ore\>'`$" employee.txt

得到输出:

1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000

感谢大家的帮助:)

【问题讨论】:

不使用正则表达式的原因是什么? 带正则表达式的 awk 真的是去这里的方法...awk -F: '$5 ~ /ore$/' input.txt cut -d ":" -f4 employee.txt | grep 'ore\>' 继承人的代码它只显示我想要完整详细信息的位置@anubhava @Shawn 我是新手,考试我必须使用 grep 所以不能使用 awk。 OP 指定(没有正则表达式)请不要删除它,否则答案看起来无关紧要。 【参考方案1】:

这里是使用awk非正则表达式方法

awk -F: -v s="ore" '(n=index($5,s)) && (n + length(s)-1) == length($5)' file

1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000

详情:

index($5,s) 函数在第五列中查找输入字符串 ore 的位置,即每行的 $5 (index($5,s) + length(s)-1) == length($5) 检查是为了确保ore$5 的结束子串

正则表达式方法会更简单:

awk -F: -v s="ore" '$5 ~ s "$"' file

【讨论】:

感谢您的解释。我们可以对 grep 使用同样的方法吗?还是仅适用于awk? p.s.从未使用过 awk。 学习awk,功能更强大,功能更丰富。顺便说一句grep 不能没有正则表达式 我开始越来越欣赏 awk @Babbaranish 不要将 grep 用于涉及字段匹配的任何事情,awk 更简单、更健壮且更易于扩展。如果您的字符串是 .txt 而不是 ore 您可以按原样使用 awk 解决方案,但您不能只使用与 ore 相同的 grep 解决方案,因为现在您有一个正则表达式元字符(.) 必须在搜索字符串中添加要处理的代码。同样,如果您的输入只有 5 个字段而不是 7 个字段,您可以再次按原样使用 awk 解决方案,但您必须更改任何当前发布的 grep 解决方案,因为您的目标字符串后面不再有 :【参考方案2】:

我们可以在这里使用这个简单的awk 解决方案。根据 OP 的要求,没有正则表达式方法。简单的解释是:检查第 5 个字段的最后 3 个字符是否是或然后打印该行。

awk 'BEGINFS=OFS=":" substr($5,length($5)-2)=="ore"' Input_file

通用答案:根据 Ed sir 的好建议,在此处添加更通用的解决方案。需要查看可以根据字符串设置尾部值的位置。

awk 'BEGINFS=OFS=":"; tail="ore" substr($5,length($5)-length(tail)+1)==tail' Input_file

【讨论】:

【参考方案3】:

仅使用grep(使用正则表达式;在grep 中避免它们的唯一方法是使用grep -F,它会进行文字字符串匹配):

$ grep -E '^([^:]*:)4[^:]*ore:' input.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000

解释:

使用扩展而不是基本正则表达式语法以提高可读性:

从行首开始,匹配四个字段(0 个或多个非: 字符后跟一个:),然后是第五个以 ore 结尾的字段(同样,0 个或多个非@ 987654327@ 个字符,然后是 ore,最后是字段末尾的 :

【讨论】:

用于比较的 BRE 版本:grep '^\([^:]*:\)\4\[^:]*ore:' input.txt【参考方案4】:

以防万一您改变主意使用正则表达式。

使用 awk:

$ awk -F: -v ends="ore" '$5~".*"ends' file.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000

使用 grep:

$ grep 'ore:' file.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000

或者这个:

$ grep -E '(.*:)4.*ore:' file.txt
1002:Johnson:TE::Bangalore:18-Jun-2000:50000
1006:LilySE:IVS::Bangalore:17-Dec-2015:40000

【讨论】:

【参考方案5】:

fgrep "ore:" employee.txt

f(ast)grep 是完全匹配无正则表达式的字符串(与grep -F 相同)

它不会知道它匹配的是哪一列, 所以过滤器必须在之前或之后发生。

【讨论】:

以上是关于如何匹配文件中的某些单词并列出该匹配单词的所有行? (没有正则表达式)的主要内容,如果未能解决你的问题,请参考以下文章

以任何顺序匹配查询中的所有单词的正则表达式

过滤掉某些单词并只匹配确切的单词

列出与给定前缀匹配的单词的新单词表(python 理解问题)

python如何查找两个文本文件之间的所有单词匹配

如何在 Go 中列出所有匹配的进程? [关闭]

如何使用正则表达式匹配不以某些字符开头或结尾的单词?