Печать строк, содержащих строку только один раз

Например, это мой файл называется Weapons:

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

Я хочу ввести команду, которая будет отображать строки, содержащие Bow только однажды.

Вот что я попробовал:

grep -n "Bow" Weapons

Но он отображает только все строки, которые содержат Bow, Как отобразить только строку, содержащую Bow только раз?

2 ответа

Решение

Ты можешь использовать Bow в качестве разделителя полей в awk и просто выведите, если это приводит к двум полям в строке:

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

И использовать IGNORECASE=1 если вы хотите, чтобы это не зависело от регистра.

Чтобы соответствовать точное слово (Bow но нет bowtieНапример, вы можете использовать с GNU awk, благодаря предложению Эда Мортона, <> якоря, чтобы указать пределы слова (как \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

Вы можете использовать опцию build in в команде sort:

sort -u file | grep -i bow

или если вы настаиваете на использовании уникального

sort file | uniq  | grep -i bow
Другие вопросы по тегам