【问题标题】:How to find all lines which contain at least one of a set of words as a prefix [closed]如何查找包含一组单词中的至少一个作为前缀的所有行[关闭]
【发布时间】:2021-07-16 05:18:11
【问题描述】:

我有一个单词的文本文件,每行一个,称为 A。

我有另一个文本文件 B。

如何找到 B 中的所有行,其中至少有一个来自 A 的单词作为前缀?

我希望能够从命令行执行此操作,也许使用 grep 但任何其他命令行解决方案也很棒。

例如,如果 A 是

apple
bob
cheese

B 是

aple
bob123
ches

我希望返回 bob123 行。

【问题讨论】:

  • 不是我的反对意见,但可能是因为您没有添加您自己尝试解决的问题。此外,如果您的输入文件可能非常大,you can adapt my answer 以获得更快的解决方案。
  • @Sundeep 这真的意味着添加对问题不起作用的代码吗?我不确定这是否总是有用的。
  • @Anush 是的,这就是 SO 所期望的。不工作的代码还可以帮助确定您的尝试中出了什么问题,因为有很多方法可以解决问题。在某些情况下,您的代码会出错。包含该错误消息是另一种在 Internet 上搜索解决方案的方法,因此也很有帮助。

标签: linux bash command-line grep


【解决方案1】:

一种方法使用bashprocess substitutionsed 将正则表达式开头^ 锚点添加到A 的每一行,然后告诉grep 将其用作列表要搜索的正则表达式:

$ grep -f <(sed 's/^/^/' a.txt) b.txt
bob123

【讨论】:

  • 或者使用 POSIX 友好的 shell 方言:sed 's/^/^/' a.txt | grep -f - -- b.txt
  • @LéaGris 问题 is 标记为 bash (但公平地说,有很多人似乎认为所有 shell 都是 bash,无论它们实际使用什么。)
  • 直到他们意识到它适用于 MacOS 的旧 Bash 3.2 或 Zsh。这就是为什么,除非特定于 Bash 的语法确实比 POSIX shell 具有显着优势;我尝试在我的答案中使用 POSIX 方式(至少作为 Bash 语法的替代方法);即使它显然更复杂、更难阅读或效率更低。正如你所说:plenty of people who seem to think that all shells are bash no matter what they're actually using.
  • 这个特别适用于旧的 bash、zsh、ksh93 ......除了 sh 和也许 (t)csh、fwiw 之外的所有东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-04
  • 2020-04-08
  • 2019-03-05
相关资源
最近更新 更多