Выражение регулярного выражения Awk для выбора определенного количества разделителей в поле - PullRequest
0 голосов
/ 22 апреля 2020

Я пытаюсь выбрать для поля, которое имеет точно определенное количество запятых. Например, я могу выбрать 1 запятую в поле следующим образом:

$ echo jkl,abc | awk '$1 ~ /[a-z],[a-z]/{print $0}'
jkl,abc

Ожидается ожидаемый вывод "jkl, ab c".

Однако, когда я попробуйте 2 запятых, это не работает.

$ echo jkl,abc,xyz | awk '$1 ~ /[a-z],[a-z],[a-z]/{print $0}'
(no output)

Есть мысли?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 22 апреля 2020

Это должно быть как:

echo jkl,abc,xyz | awk '/[a-z]+,[a-z]+,[a-z]+/{print $0}'

ИЛИ

echo jkl,abc,xyz | awk '/[a-z]+,[a-z]+,[a-z]+/'

Код OP, почему это не так working:

Поскольку OP упоминает только 1 вхождение [a-z] и ,, но это не тот случай, если в строке перед запятой присутствует более 1 символа, следовательно, он не соответствует Это. С указанным вами кодом $1 не требуется, поскольку вы соответствуете целой строке, поэтому я удалил $1 деталь из решения.

Если у вас есть несколько полей (разделенных пробелами), и вы хотите проверить условие в первой части вы можете go с:

echo "jkl,abc,xyz blabla" | awk '$1 ~ /[a-z]+,[a-z]+,[a-z]+/'
1 голос
/ 22 апреля 2020

Ваш средний сегмент регулярного выражения не учитывал более одной буквы между запятыми, поэтому вы должны были сделать только одну его часть [a-z]* или [a-z]+ в зависимости от ваших требований к обработке регистра букв нуля .

Некоторые подходы, чтобы рассмотреть возможность найти 2 или более запятых в поле:

$ echo jkl,abc,xyz | awk '$1 ~ /[a-z],[a-z]*,[a-z]/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk '$1 ~ /([a-z]*,){2,}/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk '$1 ~ /[^,],[^,]*,[^,]/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk '$1 ~ /([^,]*,){2,}/'
jkl,abc,xyz

$ echo jkl,abc,xyz | awk 'gsub(/,/,"&",$1) > 1'
jkl,abc,xyz
1 голос
/ 22 апреля 2020

/[a-z],[a-z],[a-z]/ не соответствует jkl,abc,xyz, потому что вы не использовали квантификаторы. Правильное регулярное выражение было бы: /^[a-z]+,[a-z]+,[a-z]+$/ например

awk '/^[a-z]+,[a-z]+,[a-z]+$/' <<< 'jkl,abc,xyz'

Однако, чтобы проверить количество запятых, было бы лучше сравнить количество полей при использовании FS = ",", например:

awk -F, 'NF == 2' <<< 'jkl,abc'
awk -F, 'NF == 3' <<< 'jkl,abc,xyz'

jkl,abc
jkl,abc,xyz
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...