Подсчитайте успешные переходы значений - PullRequest
2 голосов
/ 06 февраля 2020

У меня есть набор данных, который выглядит следующим образом:

2.0
2.6
3.2
2.9
3.8
3.5
3.9
3.4
4.0
3.3
2.8
2.9

Я хочу применить верхнюю и нижнюю границы для набора данных 3.8 и 3.0. Используя эти границы, я хотел бы посчитать успешные переходы от 3,0 до 3,8 выше, но не случаи, когда данные просто превосходят 3,0. Я также хотел бы подсчитать обратные события, когда данные превышают 3.8 и ниже 3.0, но не случаи, когда они начинаются с 3.8 и ниже 3.8, а затем возвращаются выше 3.8.

Есть ли способ сделать это с помощью awk?

Любая помощь будет высоко ценится.

Ответы [ 2 ]

3 голосов
/ 06 февраля 2020

Как это:

awk -v up=3.8 -v low=3.0 -c=0 '!f&&$0<=low{f=1}f&&$0>up{f=0;c++}END{print c?c:0}' file
1

Объяснение:

# I'm using a variable 'f' (flag) to store if we are within a low -> up
# range or not. awk auto-initialized the variable with 0 for us. We have
# to initialize 'c', because it might otherwise not been set when no
# result is found
BEGIN {
    c=0
}

# set the flag if the current value <= the lower boundary
!f && $0<=low {
    f=1
}

# reset the flag if the flag is set and we surpass the upper boundary
# increment the count 'c'
f && $0>up{
    f=0
    c++
}
# Print c at the end of input. Note that c
END{print c}
1 голос
/ 06 февраля 2020

Как насчет этого? U и L передаются как нижняя и верхняя границы, тогда как лог c кода должен быть простым:

  • , если мы ниже L, мы являемся кандидатом на повышение
  • если мы выше U, мы - кандидаты на падение
  • , если мы выше U и мы кандидаты на повышение, тогда мы поднялись
  • если мы ниже L и мы являемся кандидатами на падение, то мы упали
< your_file awk -v L="3.0" -v U="3.8" '
{
if ($0 < L) { rising = 1 }
if ($0 > U) { falling = 1 }
if ($0 > U && rising == 1) { rises += 1; rising = 0 }
if ($0 < L && falling == 1) { falls += 1; falling = 0 }
}
END { print "r:", rises, " f:", falls }'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...