Як не допустити, щоб grep друкував одну і ту ж рядок кілька разів?


15

Якщо я збираю файл, що містить таке:

These are words
These are words
These are words
These are words

... для слова Theseвоно буде надрукувати рядок These are wordsчотири рази.

Як я можу запобігти друку повторюваних рядків grep не раз? В іншому випадку, як я можу маніпулювати виведенням grep, щоб видалити повторювані рядки?


Чи слід зберігати порядок відповідностей у висновку? Інакше команда John1024 розміщена буде працювати.
kos

Відповіді:


23

Філософія Unix - це мати інструменти, які роблять одне і роблять їх добре. У цьому випадку grepце інструмент, який вибирає текст з файлу. Щоб дізнатись, чи є дублікати, один сортує текст. Щоб видалити дублікати, використовується -uпараметр до sort. Таким чином:

grep These filename | sort -u

sortмає багато варіантів: див man sort. Якщо ви хочете порахувати дублікати або маєте складнішу схему визначення того, що є чи не є дублікатом, то переведіть вихід сортування на uniq: grep These filename | sort | uniqі перегляньте manuniq` для опцій.


2

Використання grepта додатковий комутатор, якщо ви шукаєте лише одну струну

grep -m1 'These' filename

З man grep

-m NUM, --max-count=NUM
        Stop reading a file after NUM matching lines.  If the input is
        standard input from a regular file, and NUM matching lines are
        output, grep ensures that the standard input is positioned  to
        just  after  the  last matching  line  before exiting, regardless
        of the presence of trailing context lines.  This enables a calling
        process to resume a search.  When grep stops after NUM matching
        lines, it outputs any trailing context lines.  When the -c or
        --count option is also used, grep does not output a count greater
        than NUM.  When the -v or --invert-match option is also used, grep
        stops after outputting NUM non-matching lines.

або використовуючи awk ;)

awk '/These/ {print; exit}' foo

IMHO, найбільш відповідна відповідь - прапор -m. Я пропоную вам поставити це у верхній частині своєї відповіді. Дуже гарна відповідь!
Сергій Колодяжний

3
Це не спрацює, якщо ви використовуєте регулярний вираз - він зупиниться одразу після першого матчу, не переконайтеся, що ви отримаєте один і лише один із можливих матчів.
csvan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.