1

Я хочу добавить переменную и результат функции в AWK. Входные данные:

t t t t
a t a ta
ata ta a a

Автор сценария:

{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0

Выход:

4
2
2
0#<-the last print

2 ответа2

3

gsub не просто считает события, он фактически заменяет их. Первый оператор print, который у вас там есть (предположительно для отладки), нарушает его.

2

Проблема с вашим кодом, как отметил Брэндон Ксавьер, в том, что gsub не просто считает совпадения; это фактически заменяет их.  Так, например,

{
    print
    print gsub("t", "")
    print
    print gsub("t", "")
    print
    print "----------"
}

будет печатать

t t t t
4

0

----------
a t a ta
2
a  a a
0
a  a a
----------
ata ta a a
2
aa a a a
0
aa a a a
----------

Если вас не интересует искажение ваших входных данных (т. Е. Если единственное, что вы хотите с ними сделать, это подсчет t s), вы можете воспользоваться предложением Брэндона:

{
    x = gsub("t", "")
    print x
    b=b+x
}
END {print b}

Вышесказанное является, пожалуй, лучшим ответом, поскольку оно устраняет ваши избыточные вызовы gsub .  (Следующие подходы все еще используют два вызова gsub .)

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

{
    key="t"
    print gsub(key, key)
    b=b+gsub(key, key)
}
END {print b}

т.е. заменить t с собой, так что они все еще там , когда вы делаете второй gsub  (Вы также можете использовать gsub(key, "&") для замены key на себя.)

Другой подход заключается в том, чтобы заставить первый gsub модифицировать что-то кроме фактической строки ввода:

{
    temp=$0
    print gsub("t", "", temp)
    b = b + gsub("t", "")
}
END {print b}

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .