В perl
:
#! /usr/bin/perl
use strict;
my %mergecol = ();
while(<>) {
s/#.*//; # strip comments
next if (m/^\s*$/); # skip empty lines
chomp;
my ($val,$key) = split ',';
push @{ $mergecol{$key} }, $val;
};
foreach my $k (keys %mergecol) {
printf "%s,%s\n", $k, join('-', @{ $mergecol{$k} } );
}
Цикл while
читает входные данные и создает структуру Hash-of-Arrays (HoA) - ассоциативный массив, где каждый элемент является массивом (он же "список"). Ключами хэша являются вторые поля, а элементами каждого списка - первые поля строк с тем же вторым полем.
В конце скрипта распечатывается HoA по одной строке на запись, с именем ключа, запятой, а затем элементы, соединенные -
.
выполнить как:
$ ./rock.pl rock.txt
254341,gcmj7krrx5x6nf8r
254333,ysezaratlycpuggl-gqjp2rsjmk1a2v9c-twdzyi2ddbnrfknd-tpqorqbyrg1nmm7s
254344,hguvgstqxu3gowfg
254343,pw1jc5ssyt6hx618-pht92h4adr3mrbz3-alnac47rt8d4ege3
Или сократить и вставить в команду оболочки или сценарий как "однострочный текст":
$ perl -n -e '
s/#.*//;
next if (m/^\s*$/);
chomp; ($v,$k)=split ","; push @{ $mc{$k} }, $v;
END {
foreach $k (keys %mc) { printf "%s,%s\n", $k, join("-",@{$mc{$k}}) }
}' rock.txt
Или
$ perl -e 'while(<>) {s/#.*//;next if (m/^\s*$/);chomp;($v,$k)=split ",";push @{$mc{$k}}, $v};
foreach $k (keys %mc) {printf "%s,%s\n",$k,join("-",@{$mc{$k}})}' rock.txt
Обратите внимание, что хэш или ассоциативный массив по своей природе неупорядочен, если вам нужен отсортированный вывод, либо передайте в sort
, либо используйте (sort keys %f)
в строках foreach my $k
выше.
(1) Самый простой способ определить Postfix - это, вероятно, iptables --owner --uid-owner postfix
match, чтобы указать пользователя Postfix. Вы также можете запустить Postfix в его собственном сетевом пространстве имен или cgroup, подобно решениям в Блокировать сетевой доступ процесса? (и разрешить только этому пространству имен или cgroup отправлять SMTP-трафик).
(2) Сценарий, запускающий sendmail
, уже имеет аутентификацию: он выполняется от имени пользователя вашей системы. Существует множество вещей, которые используют этот интерфейс. Cron - один из них, но также и куча случайных скриптов - практически все в системе, отправляющей электронную почту, использует его. Даже установленные MUA (mutt и т.д.) часто используют его по умолчанию.
Предположительно, вы можете заблокировать его только для определенных пользователей, либо используя разрешения файловой системы (сделать его исполняемым только для определенной группы или определенных пользователей с помощью ACL), либо, возможно, конфигурацию Postfix (хотя лично я использую Exim, поэтому не уверен, как это сделать).