2014-10-29 2 views
0

здесь У меня есть часть моего awk-кода для анализа файла, но вывод не на 100%, что я хочу.Что делает этот код? (awk)

match($0,/root=[^,]*/){ 
     n=split(substr($0,RSTART+5,RLENGTH-5),N,/:/) 

Моя проблема в том, что я не могу сказать на 100%, что этот кусок кода именно делает ... Может кто-то просто сказать мне, что эти две строчки точно делать?

EDIT: Я просто хочу знать, что делает код, поэтому я могу исправить это самостоятельно, поэтому, пожалуйста, не спрашивайте что-то вроде: как выглядит файл, который вы разбираете? ..

ответ

2

матча (с, г [а])

Возвращает позицию в сек, где происходит регулярное выражение г, или 0, если г нет, и устанавливает значения RSTART и RLENGTH. Отметьте , что порядок аргументов такой же, как для оператора ~: str ~ re. Если предусмотрен массив a, то а очищается, а затем элементы с 1 по n равны , заполненными частями s, которые соответствуют соответствующему подвыражению в скобках в. 0-й элемент a содержит часть s , совпадающую со всем регулярным выражением r. Подстрочные индексы a [n, "start"] и [n, "length"] предоставляют начальный индекс в строке и длину каждой соответствующей подстроки.

зиЬзЬг (с, я [п])

Возвращает самое большее п-символов подстроку с, начиная с I. Если n равно , то остальная часть s используется.

сплит (с, а [, г])

разбивает строку S в массив а на регулярных выражения г, и возвращает количество полей. Если r опущено, вместо этого используется FS. Сначала выполняется очистка массива a. Разделение ведет себя одинаково с полем , описанным выше.

Так что, когда матч находит что-то, что соответствует /root=[^,]*/ в строке ($0) вернет эту позицию (ненулевые целые числа истинны-у для AWK) и действие будет выполняться.

Действие затем использует RSTART и RLENGTH как установлено match, чтобы получить подстроку строки, которая соответствовала (минус root= из-за +5/-5), а затем расщепляется, что в массиве N на : и сохраняет число полей Разделить на n.

Возможно, это может быть изменено на match($0, /root=([^,]*)/, N) в качестве шаблона, а затем используйте N[1,"start"] в действии вместо substr, если хотите.

+0

спасибо, отличный ответ, но что изменилось, когда можно сказать, что я устанавливаю RSTART на +10 и RLENGTH до -10? – howdoesthiswork

+0

От 'man awk' -> Индекс первого символа, совпадающего с match(); 0, если нет совпадения. (Это означает, что индексы символов начинаются с одного.) – fedorqui

+0

@howdoesthiswork Присвоить им эти значения или изменить смещения этими значениями? Я собираюсь предположить, что вы имеете в виду изменение смещений. В этом случае результат из 'substr' будет только начинаться с пяти символов в строке соответствия. Попробуйте и узнайте.'print substr ($ 0, RSTART + 10, RLENGTH-10) ' –