Ну, я разобрался. Вроде того.
У меня есть другой сервер, где 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
Ответ 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
Миллер был создан для решения следующих задач:
$ 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 С 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 ...
)
Рассмотрите возможность использования действительного база данных.
Используя песочницу 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.)