Як використовувати регулярний вираз як роздільник поля в awk?


16

Я намагаюся використовувати регулярний вираз в якості сепаратора поля в awk. З мого читання це здається можливим, але я не можу правильно зрозуміти синтаксис.

rpm -qa | awk '{ 'FS == [0-9]' ; print $1 }'
awk: cmd. line:1: { FS
awk: cmd. line:1:     ^ unexpected newline or end of string

Думки? Мета, якщо це не порушення, - отримати список програмного забезпечення без номера версії.

Відповіді:


25

Ви вимкнули свої цитати та синтаксис. Щоб встановити роздільник поля введення, найпростіший спосіб зробити це за допомогою -Fпараметра в командному рядку:

awk -F '[0-9]' '{ print $1 }'

або

awk -F '[[:digit:]]' '{ print $1 }'

Це використовує будь-яку цифру як роздільник поля введення, а потім виводить перше поле з кожного рядка.

[0-9]І [[:digit:]]вирази не зовсім те ж саме, в залежності від місцевості. Див. " Різниця між [0-9], [[: цифра:]] та \ d ".

Можна було також встановити FSв самій awkпрограмі. Зазвичай це робиться в BEGINблоці, оскільки це одноразова ініціалізація:

awk 'BEGIN { FS = "[0-9]" } { print $1 }'

Зауважте, що одиничні лапки не можуть бути використані в однорядковому рядку оболонки, і що awkрядки завжди використовують подвійні лапки.


12

+1 за відповідь Кусалаланда. Альтернативно, змінна FS може бути встановлена ​​в блоці BEGIN:

awk 'BEGIN {FS="[0-9]"} {print $1}'

Зміна FS в блоці дій не набере чинності, поки не буде прочитаний наступний рядок

$ printf "%s\n" "abc123 def456" "ghi789 jkl0" | awk '{FS="[0-9]"; print $1}'
abc123
ghi

Інші помилки у питанні:

  • не вдається використати одиничні лапки всередині одного котируваного рядка
  • ==є оператором порівняння, =призначений для призначення змінних

1
"Зміна FS в блоці дій не набере чинності, поки не буде прочитано наступний рядок" Я шукав всю інформацію для цієї інформації.
Саміздіс

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