Пример ввода
12.0000 0.6000000 0.05
13.0000 1.6000000 0.05
14.0000 2.6000000 0.05
15.0000 3.0000000 0.05
15.0000 3.2000000 0.05
15.0000 3.4000000 0.05
15.0000 3.6000000 0.10
15.0000 3.8000000 0.10
15.0000 4.0000000 0.10
15.0000 4.2000000 0.11
15.0000 4.4000000 0.12
15.0000 4.6000000 0.13
15.0000 4.8000000 0.14
15.0000 5.0000000 0.15
15.0000 5.2000000 0.14
15.0000 5.4000000 0.13
15.0000 5.6000000 0.12
15.0000 5.8000000 0.11
15.0000 6.0000000 0.10
15.0000 6.2000000 0.10
15.0000 6.4000000 0.10
15.0000 6.6000000 0.05
15.0000 6.8000000 0.05
15.0000 7.0000000 0.05
Цель
- Вывести строку 1 на выходе как 0 0
- Для $ 2 = 5,000000, $ 3 = 0,15.
- Вывести строку 2 при выводе как 1 0,15
- Для $ 2 = 4,800000 - $ 2 = 5.200000, сумма + = 3 доллара для каждой строки (то есть 0,14 + 0,15 + 0,14 = 0,43).
- Вывести строку 3 на выходе как 2 0,43.
- Для $ 2 = от 4,600000 до $ 2 = 5,400000, сумма + = 3 доллара для каждой строки (то есть 0,13 + 0,14 + 0,15 + 0,14 + 0,13 = 0,69).
- Вывести строку 4 на выходе как 3 0,69
- Продолжайте эту схему, пока $ 2 = 5.000000 + - 1.6 (всего 9 строк, плюс строка 1 как 0 0 = 10 строк в выводе)
желаемый выход
0 0
1 0.15
2 0.43
3 0.69
4 0.93
5 1.15
6 1.35
7 1.55
8 1.75
9 1.85
Попытка
Сценарий 1
#!/bin/bash
for (( i=0; i<=8; i++ )); do
awk '$2 >= 5.0000000-'$i'*0.2 {sum+=$3}
$2 == 5.0000000+'$i'*0.2 {print '$i', sum; exit
}' test.dat
done > test.out
производит
0 0.15
1 0.43
2 0.69
3 0.93
4 1.15
5 1.35
6 1.55
7 1.75
8 1.85
Это очень близко. Однако для строки 1 в выводе отсутствует 0 0, и из-за этого строки 2–10 содержат $ 1 и $ 2, не соответствующие одной строке.
Сценарий 2
#!/bin/bash
for (( i=0; i<=8; i++ )); do
awk ''$i'==0 {sum=0}
'$i'>0 && $2 > 5.0000000-'$i'*0.2 {sum+=$3}
$2 == 5.0000000+'$i'*0.2 - ('$i' ? 0.2 : 0) {print '$i', sum; exit
}' test.dat
done > test.out
, который производит
0 0
1 0.15
2 0.43
4 0.93
5 1.15
6 1.35
7 1.55
$ 1 и $ 2 теперь правильно сопоставлены. Однако я пропускаю строки с $ 1 = 3, $ 1 = 8 и $ 1 = 9 полностью. Добавление тернарного оператора заставляет мой код как-то пропускать эти итерации в цикле.
Вопрос
Может кто-нибудь объяснить, что не так со сценарием 2 или как добиться желаемого результата в одной строке кода? Спасибо.
Решение
Я использовал решение Эда Мортона, чтобы решить эту проблему. Оба они работают для разных целей. Вместо того, чтобы использовать модуль для экономии места в массиве, я ограничил массив $ 1 = 15,0000. Я сделал это вместо модуля, чтобы включить две другие «ключевые» переменные, которые я хотел также суммировать в разных частях ввода, в отдельные выходные файлы.
Кроме того, насколько я понял, скрипт суммировался только для строк с $ 2> = 5.0000000, а затем умножил суммирование на 2, чтобы включить строки с $ 2 <= 5.0000000. Это работает для примера ввода здесь, потому что я сделал $ 3 симметричным около 0,15. Я изменил его, чтобы суммировать их отдельно. </p>
awk 'BEGIN { key=5; range=9}
$1 == 15.0000 {
a[NR] = $3
}
$2 == key { keyIdx = NR}
END {
print (0, 0) > "test.out"
sum = a[keyIdx]
for (delta=1; delta<=range; delta++) {
print (delta, sum) > "test.out"
plusIdx = (keyIdx + delta)
minusIdx = (keyIdx - delta)
sum += a[plusIdx] + a[minusIdx]
}
exit
}' test.dat