Как распечатать определенное поле в AWK?

Очень простой вопрос, на который так и не нашел ответа. Как распечатать определенное поле в awk?

awk '/word1/', распечатает все предложение, когда мне нужно только word1. Или мне нужно, чтобы цепочка узоров (word1 + word2) выводилась только из текста.


person user1191129    schedule 05.02.2012    source источник
comment
Можете ли вы привести более подробный пример вашего ввода? Вы пытаетесь воспроизвести grep -o?   -  person Johnsyweb    schedule 06.02.2012
comment
У меня есть текст Привет, друзья, как дела в эти солнечные дни?. Я ищу /how are/ строку полей, она найдена, и awk распечатывает все предложение с этими совпадающими шаблонами. Мне не нужен такой выход. Мне нужны только эти два совпадающих слова. Итак, мой ввод awk должен быть таким, как   -  person user1191129    schedule 06.02.2012
comment
Звучит так же, как grep -o :)   -  person Johnsyweb    schedule 06.02.2012


Ответы (4)


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

awk -v MYPATTERN="INSERT_YOUR_PATTERN" '$0 ~ MYPATTERN { print MYPATTERN }' INPUTFILE

Если ваш шаблон является регулярным выражением:

awk -v MYPATTERN="INSERT_YOUR_PATTERN" '$0 ~ MYPATTERN { print gensub(".*(" MYPATTERN ").*","\\1","1",$0) }' INPUTFILE

Если ваш шаблон должен быть проверен в каждом отдельном поле:

awk -v MYPATTERN="INSERT_YOUR_PATTERN" '$0 ~ MYPATTERN { 
    for (i=1;i<=NF;i++) {
        if ($i ~ MYPATTERN) { print "Field " i " in " NR " row matches: " MYPATTERN }
    }
}' INPUTFILE

Измените любой из вышеперечисленных на свой вкус.

person Zsolt Botykai    schedule 05.02.2012

Поля в awk представлены как $1, $2 и т. д.:

$ echo this is a string | awk '{ print $2 }'
is

$0 — вся строка, $1 — первое поле, $2 — следующее поле (или пустое), $NF — последнее поле, $(NF-1) — предпоследнее поле и т. д.

РЕДАКТИРОВАТЬ (в ответ на комментарий).

Вы можете попробовать:

awk '/crazy/{ print substr( $0, match( $0, "crazy" ), RLENGTH )}'
person William Pursell    schedule 05.02.2012
comment
Я это знаю) Как я могу распечатать ТОЛЬКО СОВПАДАЮЩУЮ выкройку? У меня есть предложение Привет, сумасшедший мир. Мне нужно найти /сумасшедший/ и вывести ТОЛЬКО слово с ума, если оно было найдено. - person user1191129; 06.02.2012
comment
Интересно, есть ли встроенная переменная awk для совпадающего шаблона? - person user1191129; 06.02.2012

я знаю, что вы можете сделать это с помощью awk: альтернативой может быть:

sed -nr "s/.*(PATTERN_TO_MATCH).*/\1/p" file

или вы можете использовать grep -o

person Vijay    schedule 06.02.2012

Что-то вроде этого, возможно:

awk '{split("bla1 bla2 bla3",a," "); print a[1], a[2], a[3]}'
person Dr G    schedule 05.02.2012
comment
Нет, мне нужно, чтобы awk печатал только совпадающее слово1. Представьте, что у нас есть текст, в котором мне нужно найти цепочку слов и распечатать цепочку. Мне не нужно целое предложение, мне нужна только эта конкретная цепочка или слово. - person user1191129; 06.02.2012