Экстракт, вырезать, обрабатывать струны в bash Сценарий

На ваш вопрос по-прежнему практически невозможно ответить из-за расплывчатости и неполноты. Вы не показали ни свои входные данные (как запрошено) , ни какой-либо код (как запрошено). Однако вы позволяете себе проблеск утечки информации:

++ expr 0 + 496.8
expr: non-numeric argument

expr не работает с нецелыми числами (т. Е. Числами с десятичной точкой). Вам нужно либо преобразовать данные в целые числа , либо использовать программу калькулятора, которая обрабатывает нецелые числа ( bc - хороший вариант).

1
18.10.2018, 15:55
4 ответа
#!/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

0
27.01.2020, 23:42

Попробуйте также этот простой 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
1
27.01.2020, 23:42
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

Дайте мне знать, если это можно улучшить.

0
27.01.2020, 23:42

Учитывая два файла, которые вы показываете в начале своего вопроса, и предполагая, что они на самом деле не содержат пустых строк:

$ 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*
0
27.01.2020, 23:42

Теги

Похожие вопросы