суммирование данных 4-го поля между шаблоном

#scripting

#сценарии

Вопрос:

предположим, что мои данные :

*dnet *1234 1.2

1 порт * 12 2.3

3 порта 1 * 34 0.2

7 *15 0.1

* dnet *234 0.2

2 *12 0.1

4 *123 *234 1.2

поля разделены пробелом.

В этом я хочу получить сумму 4-х полей данных, присутствующих внутри каждого * dnet. Некоторые поля имеют данные 4-го поля, а некоторые нет. Я хочу, чтобы значение суммы 4-го поля для каждого * dnet было отдельным.

Я пытался использовать awk, но не смог получить. Буду благодарен, если кто-нибудь поможет.

вывод для приведенного выше будет выглядеть следующим образом

*dnet *1234 1.2 2.5

*dnet *234 0.2 1.2

Комментарии:

1. awk 'function p(){if(n){print n,s;n=s=0}} $1=="*dnet"{p();n=$0;next} $4{s =$4} END{p()}' data

2. Большое тебе спасибо, приятель, это работает. вы великолепны!

3. Не могли бы вы, пожалуйста, объяснить код один раз. Это будет полезно

Ответ №1:

Прокомментированная, слегка упрощенная версия комментария…

 awk '
    # look for header line
    $1=="*dnet" {
        # print any previously calculated sum
        if (header) print header, sum

        # reset sum for next block of lines
        sum = 0

        # save new header line
        header = $0

        # skip remaining actions
        next
    }

    # if we get here, we know this is not a header line
    # if there is a 4th field, add it to the sum
    $4 {
        sum  = $4
    }

    END {
        # print the final sum
        if (header) print header, sum
    }
' datafile