Мне нравятся пробелы и описательные имена переменных.Что тут еще можно сказать? Прошло много времени с тех пор, как я написал много awk
, я даже забыл о -f
на шебанге. Однако, делая это, я действительно чувствовал себя в дзен. Код хайку.
Мне нравится это решение, потому что в нем минимум закодированной логики. Всего два цикла for, перебирающих индексы массива. Нет трехэтапного пошагового выполнения для
циклов, нет операторов if
, нет явных сравнений значений. Все эти вещи статистически коррелируют с программными дефектами (ошибками). Интересно, что здесь нет явных присваиваний, а только одна математическая операция - приращение счетчика. Думаю, все это говорит о максимальном использовании языковых возможностей.
Мне кажется, что чего-то не хватает, но я еще не смог найти в этом никаких дыр.
Прокомментируйте, пожалуйста. Запрошены мнения и конструктивная критика. Я хотел бы услышать о соображениях производительности этого скрипта.
#!/usr/bin/awk -f
function count(seen, unique_count) {
for (ij in seen) {
split(ij, fields, SUBSEP)
++unique_count[fields[1]]
}
}
{
seen2[$1,$2]
seen3[$1,$3]
}
END {
count(seen2, count2)
count(seen3, count3)
for (i in count3) {
print i, count2[i], count3[i]
}
}
Аннотация
Я полагаю, что одной из уникальных особенностей этого скрипта является то, что массивы seen2
и seen3
не содержат данных, только индексы. Это потому, что мы подсчитываем только уникальные значения, поэтому единственное, что имеет значение, - это то, что значения были просмотрены, нас не волнует, сколько раз они встречаются.
#!/usr/bin/awk -f
Функция count
принимает массив seen
, индексированный двумя значениями полей, встречающихся во входных записях, либо полях 1 и 2, либо полях 1 и 3, и возвращает массив. внутренне вызываемый unique_count
, индексированный первым полем, содержащий счетчики уникальных значений поля для столбца, накопленные вторым индексом:
function count(seen, unique_count) {
Функция count
выполняет итерацию по индексам массива замечено
:
for (ij in seen) {
Разделяет индекс на два исходных значения, поле 1 и либо поле 2, либо поле 3:
split(ij, fields, SUBSEP)
Увеличивает счетчик для элемента, индексированного полем 1:
++unique_count[fields[1]]
}
}
При каждом вводе встречается строка, мы создаем пустой элемент массива, если он еще не существует, индексируемый первым полем, а также вторым или третьим полем. Сохраните отдельный массив ( visible2
и seen3
) для каждого номера поля, которое подсчитывается. Для каждого уникального значения в данном столбце (2 или 3) будет только один элемент массива:
{
seen2[$1,$2]
seen3[$1,$3]
}
В конце данных подсчитайте количество уникальных полей, видимых для каждого столбца:
END {
Передайте массивы, накопленные из введите в функцию count
и получите count2
или count3
, заполненные уникальными счетчиками полей.
count(seen2, count2)
count(seen3, count3)
Пройдите через любой из массивов count2
или count3
(неважно, какой из них, поскольку все они имеют первое поле каждой строки) и распечатайте первое поле, а затем количество уникальных значений, найденных для каждой строки, содержащей первое поле:
for (i in count3) {
print i, count2[i], count3[i]
}
}
Однострочная версия
awk 'function c(s,u){for(x in s){split(x,f,SUBSEP); ++u[f[1]];}}
{a[$1,$2]; b[$1,$3];} END {c(a,d); c(b,e); for(i in d){print i,d[i],e[i];}}'
Resulta que Perl-IPC-Run
está en el repositorio rhel-7-server-optional-rpms
que no había sido habilitado.
Estos son los pasos que tomé para solucionar el problema:
# subscription-manager repos --enable=rhel-7-server-optional-rpms
Repository 'rhel-7-server-optional-rpms' is enabled for this system.
# yum search Perl-IPC-Run
...
perl-IPC-Run.noarch : Perl module for interacting with child processes
Ahora el paquete Perl-IPC-Run
está disponible y moreutils
se instala sin errores.
Я скачал perl -IPC -Выполнить -0.84 -2.el6.rfx.noarch и проблема была исправленаhttp://rpmfind.net/linux/rpm2html/search.php?query=perl-IPC-Run