grep, сумма и среднее от большого выхода - PullRequest
0 голосов
/ 08 сентября 2018

У меня есть выходной файл с именем filename.mat0, который содержит большой список точек данных для ряда различных переменных для ряда различных временных шагов. Я хочу использовать что-то вроде команды grep, чтобы получить все экземпляры для данной переменной, то есть variable_A, затем суммировать общее значение, связанное с variable_A, и затем взять среднее значение. Количество временных шагов является постоянным, поэтому переменная_А, переменная_В и т. Д. Все появляются 100 раз в моем файле .mat. Пожалуйста, можете ли вы предложить лучший способ сделать это? Пример выходных данных:

Timestep1 Variable_A 10
Timestep1 Variable_B 20 
Timestep1 Variable_C 30 

Timestep2 Variable_A 40 
Timestep2 Variable_B 50 
Timestep2 Variable_C 60

Timestep3 Variable_A 70 
Timestep3 Variable_B 80 
Timestep3 Variable_C 90

Желаемый вывод:

Variable_A = 40

1 Ответ

0 голосов
/ 09 сентября 2018

Ссылка на это .

awk должен быть в состоянии решить проблему. Проверьте ссылку для использования awk . Приведенная ниже команда должна подойти для вашего случая, но ее нелегко использовать, если их много Variable. Надеюсь, кто-нибудь, более знакомый с awk, может подсказать, как улучшить.

awk '{if ($2 == "Variable_A"){ total += $3; count++ }} END { print "Variable_A = " total/count }' sample.mat > avg_a.txt 

Приведенная выше команда будет выполнять для каждой строки, проверить, равен ли столбец 2 (соответствует $2) «Variable_A», если да, суммировать значение в столбце 3 (соответствует $3) и добавить счетчик. После обработки всех строк выведите среднее значение в текстовый файл.

Для дальнейшего вопроса

Чтобы вывести среднее значение для нескольких переменных в одном файле, вы можете использовать массив и цикл for в AWK. Добавьте элементы к vars для дополнительных переменных.

awk 'BEGIN {vars[0]="Variable_A"; vars[1]="Variable_B"; vars[2] ="Variable_C" } { for (i in vars) { if ($2 == vars[i]){ total[i] += $3; count[i]++ }}} END { for(i in vars) {print vars[i]" = " total[i]/count[i]}}' sample.mat > avg.txt
...