#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