Сброс переменной новой строки awk - PullRequest
1 голос
/ 29 марта 2012

Я действительно не хотел тратить время людей и спрашивать об этом, но через 2 часа и из-за нехватки своего времени я решил спросить ..

В основном у меня есть файл вформат:

word: other words; more words here; last word
word: more words here; last word
(etc) x 100

Где вхождение других слов / больше слов может быть ноль или более.

Моя цель - подсчитать количество раз ';'встречается в каждой строке, а затем выведите ее в начале строки.

Моя логика заключалась в том, чтобы использовать awk для регулярного выражения ';'и увеличивайте переменную каждый раз, когда это происходит, затем печатайте переменную.

В настоящее время у меня есть: (кстати, как я могу поместить свой код как заштрихованное поле ...?)

awk ' /;/ {n=n+1} {print n " " $0}' a.txt

Однако я стал отменным в том смысле, что мой 'n' не сбрасывается, когда awk читает в следующей строке.Как мне сбросить n, когда awk переходит на следующую строку?Я попытался установить v = NR, и если v! = NR, то n = 0, но я не смог заставить это работать.

У меня также есть один последний вопрос, как мне установить переменную равнойрегулярное выражение?

Спасибо, куча,

1 Ответ

3 голосов
/ 29 марта 2012

Намного лучше потратить одну минуту моей жизни, чем сто двадцать вашей: -)

Вы можете просто использовать разделитель полей, чтобы сделать это:

pax> echo 'word: other words; more words here; last word
word: more words here; last word' | awk 'BEGIN {FS=";"}{print NF"> "$0}'

3> word: other words; more words here; last word
2> word: more words here; last word

В основном, установите разделитель полей FS на точку с запятой, чтобы количество полей NF было установлено так, как вам нужно. Затем распечатайте переменную NF вместе со всей вашей строкой $0.


И вы можете получить блоки кода, поставив перед каждой строкой четыре пробела. Когда вы задаете вопрос, в правом верхнем углу окна отображается оранжевый знак вопроса - щелкните по нему, и появится некоторая справка по форматированию через меню.


Что касается вашего последнего вопроса, дополненного вашим (перефразированным) комментарием:

У меня также есть один последний вопрос, как мне установить переменную равной регулярному выражению? Я хотел установить переменную, равную всему тексту перед «:» (поэтому регулярное выражение должно было изолировать «слово»).

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

pax> echo 'xyzzy: other words; more words here; last word
plugh: more words here; last word' | awk '
    BEGIN {FS=";"}
    {   xx = $1;
        gsub (/:.*/, "", xx);
        print NF" ("xx") > "$0
    }'
3 (xyzzy) > word1: other words; more words here; last word
2 (plugh) > word2: more words here; last word

gsub (/:.*/, "", xx) просто заменит регулярное выражение :.* (двоеточие, за которым следует что-либо) ничем для переменной xx.

...