【问题标题】:Print lines that contain a string only once仅打印一次包含字符串的行
【发布时间】:2015-02-27 14:59:54
【问题描述】:

例如这是我的文件Weapons:

Sword of Dragons
Staff of Fire
Bow of Noxious
Staff of Light
Bow of Noxious

我想输入一个命令,该命令将只显示一次包含 Bow 的行。

这是我尝试过的:

grep -n "Bow" Weapons

但它只显示包含Bow 的所有行。如何只显示一次包含Bow 的行?

【问题讨论】:

  • 所以你想要Bow 只出现一次的行,对吧?
  • 是的,我只需要它来显示包含Bow 的行一次。
  • 好的。顺便说一下,您放置“一次”也可以理解为“打印包含 'Bow' 的行并且每个文件只执行一次”。现在我很清楚了。

标签: linux grep command uniq


【解决方案1】:

您可以在awk 中使用Bow 作为字段分隔符,如果这导致一行中有2 个字段,则只需打印:

awk -F"Bow" 'NF==2' file

如果您不希望它不区分大小写,请使用IGNORECASE=1

要匹配确切的单词(例如Bow 但不是bowtie),您可以使用 GNU awk,感谢 Ed Morton 的建议,< > 锚点来指示单词的限制(如其他语言的\b):

awk -F'\\<Bow\\>' 'BEGIN {IGNORECASE=1} NF==2' a

测试

$ cat a
Sword of Dragons
Staff of Fire
Bow of Noxious
Staff of Light
Bow I like Bow
this is a bow
and this a bowtie
$ awk -F"Bow" 'NF==2' a
Bow of Noxious
$ awk -F"Bow" 'BEGIN {IGNORECASE=1} NF==2' a
Bow of Noxious
this is a bow
and this a bowtie
$ awk -F'\\<Bow\\>' 'BEGIN {IGNORECASE=1} NF==2' a
Bow of Noxious
this is a bow

【讨论】:

  • 我喜欢你的风格:-)
  • 如果文件包含“Bowler”等,将失败。您可以将-F'\\&lt;Bow\\&gt;' 与 GNU awk 一起使用。
  • @EdMorton 太棒了!谢谢,添加到答案中。
【解决方案2】:

您可以在排序命令中使用内置选项:

sort -u file | grep -i bow

或者如果你坚持使用独特的

sort file | uniq  | grep -i bow

【讨论】:

  • 如果文件包含“Bowler”等将失败。
  • 他没有要求这个词,但如果你想要它,grep 部分将是:grep -oh "\w*Bow\w*" *
  • 那仍然会失败。关键是在查找单词“Bow”时,您几乎肯定不想匹配恰好包含单词 Bow 的其他单词,例如。保龄球。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-23
  • 2019-05-25
  • 2012-11-06
  • 1970-01-01
  • 2014-09-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多