Печать строк, содержащих строку только один раз
Например, это мой файл называется 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