文本文件中某个单词的所有重复位置(按字数计算)

Joh*_*eet 6 grep wc

我想找到一个词在文本文件中出现的位置——就像一个词出现在文本中的词数——对于那个词的所有实例,但我什至不知道从哪里开始。我想我需要一个循环,以及 grep 和 wc 的某种组合。

例如,这是一篇关于 iPhone 11 的文章:

周二,该公司表示,其入门级手机 iPhone 11 的起售价为 700 美元,而去年同类机型的起价为 750 美元,这表明苹果正在关注那些不会竞相购买更昂贵手机的消费者。年。

苹果将​​其更高级机型 iPhone 11 Pro 和 iPhone 11 Pro Max 的起售价维持在 1,000 美元和 1,100 美元。该公司在其硅谷园区举行的 90 分钟新闻发布会上推出了新手机。

课文共81个字。

jaireaux@macbook:~$ wc -w temp.txt 
      81 temp.txt
Run Code Online (Sandbox Code Playgroud)

“iPhone”这个词出现了 3 次。

jaireaux@macbook:~$ grep -o -i iphone temp.txt | wc -w
       3
Run Code Online (Sandbox Code Playgroud)

我想要的输出是这样的:

jaireaux@macbook:~$ whereword iPhone temp.txt 
      24
      54
      57
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能得到那个输出?

ter*_*don 6

这是使用 GNU 工具的一种方法:

$ tr ' ' '\n' < file | tr -d '[:punct:]' | grep . | grep -nFx iPhone
25:iPhone
54:iPhone
58:iPhone
Run Code Online (Sandbox Code Playgroud)

第一个tr用换行符替换所有空格,然后第二个删除所有标点符号(以便iPhone,可以作为单词找到)。在grep .我们跳过任何空行(我们不希望这些计数)和确保grep -n追加的行号到输出。然后,-F告诉grep不要将其输入视为正则表达式,并且-x它应该只找到跨越整行的匹配项(因此job不会算作 的匹配项jobs)。请注意,您在问题中给出的数字相差 1。

如果你只想要数字,你可以添加另一个步骤:

$ tr ' ' '\n' < file | tr -d '[:punct:]' | grep . | grep -nFx iPhone | cut -d: -f1
25
54
58
Run Code Online (Sandbox Code Playgroud)

正如评论中指出的那样,这仍然会遇到诸如aren'tor 之类的“单词”问题double-barreled。您可以使用以下方法进行改进:

tr '[[:space:][:punct:]]' '\n' < file | grep . | grep -nFx iPhone
Run Code Online (Sandbox Code Playgroud)

  • 需要明确的是 - 不要使用 `tr -d '[:punct:]'` ,因为它会连接由标点符号分隔的字符串,因此它会创建实际上并不存在于您的输入中的单词,同时删除存在的单词. 做 `'tr '[[:space:][:punct:]]' '\n' &lt; file` - 它仍然不是一个完美的方法,但假设你确实想要像 `'` 那样对待标点符号,这是一个改进在“不是”中不是单词组成部分。 (2认同)