Вероятно, ближе к установщику MSI, чем setup.exe
, пакет .deb
включает в себя дерево файлов для копирования в файловая система, а также набор хуков до и после установки для запуска (среди прочего). Перехватчики могут эффективно делать что угодно в системе, включая то, что я не думаю, что когда-либо видел в Windows: добавление пользователей для системной службы. Одна вещь, которую они не могут сделать, это установить другую .пакет deb
— база данных заблокирована во время установки, поэтому этого можно добиться только через зависимости. После установки пакета .deb
создаются записи в центральной базе данных установленных пакетов для простоты обслуживания.
Пакет ttf-mscorefonts
интересен тем, что сам пакет содержит только скрипт для загрузки и установки шрифтов. Этот скрипт выполняется в одном из этих хуков.
Ближе к setup.exe
может быть загрузка исходного кода программы с домашней страницы проекта, а затем запуск ./configure && make && sudo make install
или любой другой метод, предложенный авторами. решил использовать. Так как этот способ не добавляет пакет в базу установленных программ, удалить его потом может быть гораздо сложнее.
Еще одно отличие состоит в том, что файл .deb
указывает свои зависимости, поэтому правильная установка может быть гарантирована. Насколько мне известно, в мире Windows MSI не может вызвать установку другого MSI, поэтому setup.exe
обычно используется для такого отслеживания зависимостей. В нескольких комментариях отмечается, что MSI могут называть зависимости, но поскольку нет центральной базы данных MSI, как для пакетов .deb
, отсутствие зависимости просто приведет к сбою установки.
Таким образом, .deb
является чем-то средним между установщиком MSI и setup.exe
.Пакет может делать все, что захочет, во время своих перехватчиков до и после установки, может называть и обычно находить свои собственные зависимости и оставляет запись о своей установке в центральном месте для простоты обслуживания.
Я бы обработал входной файл дважды :один раз для подсчета вхождений пар город+код и один раз для вывода отчета:
awk -F, -v OFS=, '
FNR == 1 {next}
NR == FNR {
for (i=2; i <= NF; i++)
count[$1,$i]++
next
}
{
for (i=2; i <= NF; i++)
print $1, \
$i, \
(i-1), \
(i == 2 ? "Prim" : "Secd"), \
count[$1,$i]
}
' file file
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,1
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1
BEGIN {
FS=","
OFS=","
}
{
site=$1
code[1]=$2
code[2]=$3
code[3]=$4
code[4]=$5
key=site
for (i=1; i<=4; ++i) {
cnt=i
++recs[i]
posn=""
if (cnt==1) {posn="Prim"}
else {posn="Secd"}
if (code[i] !="") { myarr[key","code[i]"," posn]++}
}
}
END{
for (i in myarr) {print i","myarr[i]}
}
Результаты:
Hendon,X002,Prim,1
Hendon,X769,Secd,1
Oxford,X011,Secd,2
Hendon,X222,Secd,1
Oxford,X532,Prim,2
Hendon,X011,Secd,1
Oxford,X989,Secd,1
Попробуйте это,
awk -F ',' '{for (i=2;i<=NF;i++) { if (i==2) {print $1","$i","i-1",""Prim"} else print $1","$i","i-1",""Secd"}}' file
Oxford,X532,1,Prim
Oxford,X011,2,Secd
Oxford,X989,3,Secd
Oxford,X532,1,Prim
Oxford,X001,2,Secd
Hendon,X002,1,Prim
Hendon,X011,2,Secd
Hendon,X222,3,Secd
Hendon,X769,4,Secd
Чтобы подвести итог, где коды, которые появляются в той же позиции
ARRAY=(`awk -F ',' '{for (i=2;i<=NF;i++) { if (i==2) {print $1","$i","i-1",""Prim"} else print $1","$i","i-1",""Secd"}}' file`)
for i in ${ARRAY[@]}
do
PATTERN=`echo $i | awk -F ',' '{print $2}'`
COUNT=`echo "${ARRAY[@]}"| tr ' ' '\n' | grep -c $PATTERN `
echo "$i,$COUNT"
done
Oxford,X532,1,Prim,2
Oxford,X011,2,Secd,2
Oxford,X989,3,Secd,1
Oxford,X532,1,Prim,2
Oxford,X001,2,Secd,1
Hendon,X002,1,Prim,1
Hendon,X011,2,Secd,2
Hendon,X222,3,Secd,1
Hendon,X769,4,Secd,1