awk сумма выбранных значений в столбце - PullRequest
0 голосов
/ 02 июля 2018

Я хочу суммировать выбранные значения в столбце в awk. Второй столбец - время. Я хочу добавлять значения из столбца 4th в каждую секунду.

Введите:

1 0.1 2 1 3
2 0.3 2 2 3
4 0.6 2 3 3
2 1.1 2 4 3
5 1.3 2 5 3
6 2.2 2 6 3
7 2.7 2 7 3
8 3.6 2 8 3
9 3.9 2 1 3
10 4.1 2 1 3

Ожидаемый результат (у нас 5 секунд):

6
9
13
9
1

EDIT:

Вот мой code, но я понятия не имею, как он работает динамически.

awk '$2>x && $2<=y (sum+=$4) END {print sum}' filename

где x - время начала, y - время окончания. Он работает только для статических значений, это значит, что теперь я могу получить результат только за одну выбранную секунду.

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

РЕДАКТИРОВАТЬ: В соответствии с запросом OP добавление кода, который будет принимать любое поле, предоставленное ему в качестве переменной awk.

awk -v col1="2"  -F"[ .]" '$col1 == prev+1{print sum;sum=prev=""} {sum+=$NF;prev=$col1} END{if(prev && sum){print sum}}' Input_file

ИЛИ (форма решения не с одним вкладышем здесь)

awk -v col1="2"  -F"[ .]" '
$col1 == prev+1{
  print sum;
  sum=prev=""
}
{
  sum+=$NF;
  prev=$col1
}
END{
  if(prev && sum){
    print sum}
}'  Input_file

Если вы передаете переменную bash в переменную awk, выполните следующие действия.

column=2 ##Shell variable
awk -v col1="$column"  -F"[ .]" '$col1 == prev+1{print sum;sum=prev=""} {sum+=$NF;prev=$col1} END{if(prev && sum){print sum}}' Input_file

Не могли бы вы попытаться выполнить следующие действия и сообщить мне, поможет ли это вам (учитывая, что ваш фактический файл Input_file совпадает с приведенным здесь примером).

awk -F"[ .]" '$2 == prev+1{print sum;sum=prev=""} {sum+=$NF;prev=$2} END{if(prev && sum){print sum}}'  Input_file

Теперь добавляем не-лайнерную форму решения.

awk -F"[ .]" '
$2 == prev+1{
  print sum;
  sum=prev=""
}
{
  sum+=$NF;
  prev=$2
}
END{
  if(prev && sum){
    print sum}
}'  Input_file
0 голосов
/ 02 июля 2018

Попробуйте следующую awk программу

BEGIN {
    total = 0
    secondEnd = 1
}
{
    if($2 < secondEnd) {
        total += $4
        next
    }

    while($2 > secondEnd) {
        print(total)
        total = 0
        secondEnd++
    }
    total = $4
}
END {
    print(total)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...