Как распечатать конкретное поле в AWK? - PullRequest
2 голосов
/ 06 февраля 2012

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

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

Ответы [ 4 ]

3 голосов
/ 06 февраля 2012

Хорошо, если шаблон представляет собой одно слово (которое вы хотите напечатать и не можете ввести 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

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

1 голос
/ 06 февраля 2012

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

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

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

0 голосов
/ 06 февраля 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 )}'
0 голосов
/ 06 февраля 2012

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

awk '{split("bla1 bla2 bla3",a," "); print a[1], a[2], a[3]}'
...