Gawk соответствует одно слово - одно неожиданное совпадение - PullRequest
0 голосов
/ 06 марта 2020

Я хотел получить все совпадения в столбце 3, которые имеют точное слово «aa» (нечувствительное к регистру совпадение) в строке в столбце 3 Команда gawk, используемая в файле awk:

$3 ~ /\<aa\>/ 

Инструкция BEGIN указывает: IGNORECASE = 1 Команда возвращает 20 строк. Что озадачивает, так это значение в столбце 3 в возвращаемых строках:

aA.AHAB

Как мне избежать этой строки, поскольку она не является словом сама по себе, потому что после первых двух аа есть точка, а не пробел?

Ответы [ 3 ]

1 голос
/ 06 марта 2020

A - это символ слова. . не является символом слова. \> соответствует строке нулевой ширины в конце слова. Такая строка нулевой ширины встречается между A и ..

Для поиска строки aa, разделенной пробелами (или началом / концом строки):

    $3 ~ /(^|[ ])aa([ ]|$)

Добавьте все остальные символы, которые вам нужны, внутри набора ([ ]).

Обратите внимание, что по умолчанию awk разбивает записи на поля в пробелах, поэтому вы не получите пробелов в $3, если только Вы изменили значение FS.

1 голос
/ 06 марта 2020

1-е решение: ИЛИ для точного соответствия aa Попробуйте:

awk 'BEGIN{IGNORECASE=1} $3 ~ /^aa$/' Input_file

2-е решение: ИЛИ без IGNORECASE опция попробуйте:

awk 'tolower($3)=="aa"' Input_file
0 голосов
/ 06 марта 2020

Вопрос: Почему шаблон регулярного выражения awk /\<aa\>/ соответствует строке типа: "aa.bbb"?

Мы можем быстро проверить это с помощью :

$ echo aa.bbb | awk '/\<aa\>/'
aa.bbb

Ответ можно найти в руководстве gnu awk:

3,7 gawk-Specifi c Операторы регулярных выражений

Программное обеспечение GNU, которое работает с регулярными выражениями, предоставляет ряд дополнительных операторов регулярных выражений. Эти операторы описаны в этом разделе и задаются c для gawk; они не доступны в других реализациях awk. Большинство дополнительных операторов имеют дело с сопоставлением слов. Для наших целей слово - это последовательность из одной или нескольких букв, цифр или символов подчеркивания ('_') :

  • \<: Соответствует пустой строке в начале слова . Например, /\<away/ соответствует "away", но не "stowaway".
  • \>: Соответствует пустой строке в конце слова . Например, /stow\>/ соответствует "stow", но не "stowaway".

источник: Руководство по GNU awk: Раздел 3 :: Регулярные выражения

Итак, чтобы вернуться к приведенному выше примеру, строка «aa.bbb» содержит два слова «aa» и «bbb», поскольку -характер не является частью набора символов, который может составить слово . Здесь сравниваются пустые строки: пустая строка перед «aa.bbb» и пустая строка между символами a и . (пустая строка на самом деле является пустой строкой длиной 0, 0 символов, обычно записывается как "")

Решение ОП: Поскольку FS, скорее всего, является значением по умолчанию, поле $3 не может содержать пробел. Поэтому возможны следующие два решения:

 $3 ~ /^aa$/
 $3 == "aa"

Если в коде определен разделитель полей FS, может работать следующее

" "$3" " ~ /" aa "/
$3 ~ /(^|[ ])aa([ ]|$)       # See solution of JHNC
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...