как вычислить среднее значение значений в столбце, учитывая информацию из другого столбца?

Ну, я разобрался. Вроде того.

У меня есть другой сервер, где yum работает нормально. Я посмотрел на репозитории там, и их оказалось меньше, чем на проблемном сервере. Поэтому на проблемном сервере я удалил "лишние" репозитории, а затем сделал 'yum clean all'.

Теперь все работает.

Репозитории, которые я удалил:

CentOS-Testing.repo
virtualmin-bleed.repo
webtatic-archive.repo
webtatic.repo
remi.repo
webtatic-el5.repo
webtatic-testing.repo

Репозитории, которые остались:

CentOS-Base.repo
CentOS-Media.repo
epel.repo
epel-testing.repo
virtualmin.repo

5
17.11.2016, 00:31
4 ответа

Ответ Awk:

awk '{y=substr($3,1,4); c[y]++; s[y]+=$2} END {for (y in c) {print y, c[y], (s[y]/c[y])}}' file.txt
5
27.01.2020, 20:32

Миллер был создан для решения следующих задач:

$ cat hogbrm.txt | \
  mlr --nidx --repifs put '$3=sub(string($3),"(....).*", "\1")' \
  then stats1 -a count,mean -f 2 -g 3
1980 2 -2455.500000
1981 1 -1153.000000
1986 6 -1114.333333

Контекст:

  • Используйте - nidx , поскольку там не является заголовком, только столбцы с позиционным индексом
  • Используйте - repifs , поскольку столбцы разделяются несколькими пробелами
  • Используйте sub , чтобы удалить последние четыре цифры даты (столбец 3)
  • Используйте stats1 , чтобы вычислить количество и среднее значение столбца 2, сгруппированного по столбцу 3
2
27.01.2020, 20:32

С gnu datamash :

cut -c1-35 infile | datamash -W -g 3 count 3 mean 2

Обратите внимание, что вам нужно обработать свои данные сначала (я использовал вырезать , поскольку это был очевидный выбор для вашего входного образца, но подойдет любой инструмент), чтобы удалить месяц и день из даты рождения:

HOGBRM443983         -2522.00  1980
HOGBRM445985         -2389.00  1980
HOUSAM1891409        -1153.00  1981
HOUSAM2004289        -650.00   1986
......

и только затем перенаправить его в датамаш .
Это также предполагает, что 3-й столбец отсортирован по году (если он не отсортирован, используйте datamash -s -W -g ... )

7
27.01.2020, 20:32

Рассмотрите возможность использования действительного база данных.

Используя песочницу Postgres, настроенную в Vagrant VM , я сделал это, выполнив следующие шаги:

CREATE TABLE MyData (id text, val float, bday date);
INSERT INTO MyData VALUES
('HOGBRM443983',-2522.00,'1980-08-26'),
('HOGBRM445985',-2389.00,'1980-11-01'),
('HOUSAM1891409',-1153.00,'1981-12-28'),
('HOUSAM2004289',-650.00,'1986-01-01'),
('HOUSAM2005991',-843.00,'1986-01-09'),
('HOCANM388722',-1546.00,'1986-01-16'),
('HOUSAM2007297',-1882.00,'1986-01-25'),
('HOUSAM2007389',-1074.00,'1986-01-28'),
('HOITAM801038516',-691.00,'1986-01-28')
;
SELECT
  extract(year FROM bday) AS yr,
  count(id) AS count,
  avg(val) AS average
FROM mydata GROUP BY yr;

Результат:

  yr  | count |      average      
------+-------+-------------------
 1981 |     1 |             -1153
 1980 |     2 |           -2455.5
 1986 |     6 | -1114.33333333333
(3 rows)

Вы, вероятно, могли бы справиться с этим с помощью обработки текста, но вы упомянули, что данные ОГРОМНЫЕ, и настоящая база данных разработана для такого рода вычислений. (И сообщение в блоге, на которое я ссылаюсь, содержит все шаги по настройке песочницы Postgres.)

2
27.01.2020, 20:32

Теги

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