(Atualizado para corrigir o formato de saída)
Usando awk
:
BEGIN { OFS = "," }
{ servers[$1] = (servers[$1] == "" ? "server:" $2 : servers[$1] "," "server:" $2 ) }
END {
$0 = ""
for (domain in servers)
$(++n) = sprintf("\"%s(%s)\"", domain, servers[domain])
print
}
Isso adicionaria os servidores como uma string delimitada por vírgula ao domínio específico no bloco principal durante a análise do arquivo de entrada. Isso é feito modificando a matriz servers
que contém os servidores de um domínio específico (o domínio é a chave na matriz).
No bloco END
, fazemos o loop de todas as chaves / domínios na matriz servers
e criamos um registro de saída no formato especificado.
Executando isso nos dados fornecidos:
$ awk -f script.awk names.txt
"TADDomain(server:TADServer_1)","ABCDomain(server:ContractABCServer_1,server:ABC_server1)","LinkDomain(server:CoreLinkServer_1)"
Um script bash
em grande parte equivalente (requer bash
4,3+ para o array associativo):
declare -A servers
while read domain server; do
servers[$domain]+="${servers[$domain]:+,}server:$server"
done <names.txt
for domain in "${!servers[@]}"; do
out+="${out:+,}\"$domain(${servers[$domain]})\""
done
printf '%s\n' "$out"
... mas veja " Por que usar um loop de shell para processar texto considerado uma prática ruim? ".