На ваш вопрос по-прежнему практически невозможно ответить из-за расплывчатости и неполноты. Вы не показали ни свои входные данные (как запрошено) , ни какой-либо код (как запрошено). Однако вы позволяете себе проблеск утечки информации:
++ expr 0 + 496.8
expr: non-numeric argument
expr
не работает с нецелыми числами (т. Е. Числами с десятичной точкой).
Вам нужно либо преобразовать данные в целые числа
, либо использовать программу калькулятора, которая обрабатывает нецелые числа ( bc
- хороший вариант).
#!/bin/bash
# Sum duplicate row values with awk ; Columns 3 and 6
awk -F '[_.:]' '{seen[$3]+=$6}END{for (i in seen) print i, seen[i]}' OFS=":" node[1-4].txt |
sort > log.txt
Источник для «#Суммировать повторяющиеся значения строк с помощью awk»https://stackoverflow.com/questions/42024296/sum-duplicate-row-values-with-awk
Попробуйте также этот простой awk
подход:
awk -F"[_.:]" ' # set field separator to "_", ".", or ":"
{SUM[$3] += $NF # sum all trailing fields in array indexed by the date
}
END {for (s in SUM) print s, SUM[s] # print the date and the respective sum
}
' OFS=":" file[123] # set output field separator; have shell expand file names 1 - 3
awk -F 'localhost_access_' '
{
n=substr($2,1+index($2,":"));
gsub(".tar.gz.*","",$2);
str[$2]+=n
}
END{
for (i in str){
print i":"str[i]
}
}' node1.txt node2.txt node3.txt node4.txt | sort -to > output.txt
output_not_sorted=$(cat output.txt);
# sort output by date
exit
Дайте мне знать, если это можно улучшить.
Учитывая два файла, которые вы показываете в начале своего вопроса, и предполагая, что они на самом деле не содержат пустых строк:
$ awk -F ':' -v OFS=':' '
{ sum[$1]+=$2 }
END { for (key in sum) {
split(key,f,"[_.]")
print f[3],sum[key] } }' file* | sort
2018-06-19:0
2018-06-20:0
2018-06-21:1
2018-06-22:0
2018-06-23:0
2018-06-24:0
2018-06-25:0
2018-06-26:1
2018-06-27:0
2018-07-04:2
2018-07-05:3
2018-07-06:6
2018-07-07:0
2018-07-19:28
2018-07-20:17
2018-07-21:12
2018-07-22:4
2018-07-23:2
2018-07-24:2905
2018-07-25:10440
2018-07-26:2644
2018-07-27:1896
2018-07-28:1238
2018-07-29:932
Используйте имя файла в качестве ключа в ассоциативном массиве с именем sum
и соберите сумму для каждого имени файла в нем. В конце переберите ключи sum
и распечатайте часть даты каждого ключа вместе с суммой. Часть ключа с датой — это третье поле после разделения на точки и символы подчеркивания.
Результатом является конвейер sort
.
Более короткий, но по существу такой же, как приведенный выше (, но использует только дату в качестве ключа в массиве sum
):
awk -F '[_.:]' -v OFS=':' '
{ sum[$3]+=$6 }
END { for (d in sum) print d, sum[d] }' file*