paulo1205
(usa Ubuntu)
Enviado em 26/04/2022 - 05:27h
Cada linha do arquivo vai ter o seguinte formato (onde
A ,
B ,
C ,
D e
E são valores inteiros, em formas de dezenas, podendo haver valores repetidos entre eles).
A ;B ;C ;D ;E
Assim sendo, após ler cada linha, haverá até cinco valores possíveis de dezenas individuais, e exatamente três sequências com três dezenas (
A;B;C ,
B;C;D e
C;D;E ).
Usando
arrays associativos (um recurso interno do
bash e do
ksh , de modo que não precisa nem invocar um comando externo que funciona como outra linguagem de programação, tal como o
awk ) você pode lembrar de todas as dezenas individuais possíveis, bem como já ir contando cada sequência de três dezenas que ocorre no arquivo, e faz isso tão logo lê cada linha.
No final da execução, você pode usar o
array associativo d chaves individuais para formar todas as possíveis sequências de três caracteres, e então usar cada elemento desse conjunto de possibilidades para consultar o
array associativo de sequências presentes no arquivo, de modo que se aquela sequência existir no
array , a quantidade é a que está armazenada na associação, e, se não existir, a quantidade é zero.
Acho que não tem como fazer de modo mais simples do que isso que eu disse acima. A resposta final é só converter para
shell o algoritmo dado.
Eu não acredito muito em dar resposta pronta na forma final. Vai que a pergunta é um trabalho de faculdade ou curso: dar a resposta pronta vai servir como uma enganação não apenas para o professor, mas para o próprio aluno que a recebeu, criando a ilusão de que sabe algo pelo qual não teve de fazer grande esforço.
Entretanto, eu já dei a resposta semi-pronta acima, em Português em vez de
shell script . Assim sendo, para não parecer que eu estou apenas blefando, vou dar outra resposta semi-pronta em outra linguagem: Perl.
#!/usr/bin/perl
# Respondendo ao tópico https://www.vivaolinux.com.br/topico/Shell-Script/Combinacao-simples/
#### FASE 1: Leitura do dados de entrada ####
# Laço de repetição que lê linhas na entrada.
while(<>){
chomp; # Descarta caráter de fim de linha (desnecessário em shell).
# Opcional: descarta linhas que não atendem ao formato especificado.
next unless /^\s*\d+;\d+;\d+;\d+;\d+$/;
($a, $b, $c, $d, $e)=split(/;/);
# Opcional (e não implementado): verifica se os valores de $a, $b, $c, $d e $e
# estão dentro da faixa aceitável.
# Para cada dezena, alimenta (incrementando a contagem de ocorrências) o
# array associativo de dezenas (elementos inicialmente inexistentes contam
# como zero no contexto de operações numéricas, o que facilita a vida).
foreach $n ($a, $b, $c, $d, $e){
++$dezenas{$n};
}
# Para cada sequência de três elementos que ocorre na linha, incrementa o
# array associativo de sequências.
++$sequencias{"$a;$b;$c"};
++$sequencias{"$b;$c;$d"};
++$sequencias{"$c;$d;$e"};
}
#### FASE 2: Produz a saída ####
# Produz uma lista ordenada de todas as dezenas encontradas.
@dezenas_ordenadas=sort(keys(%dezenas));
foreach $elem1 (@dezenas_ordenadas){
foreach $elem2 (@dezenas_ordenadas){
foreach $elem3 (@dezenas_ordenadas){
$tupla="$elem1;$elem2;$elem3";
# De novo, valho-me do fato de que elementos que não existem são
# interpretados como zero no contexto de operações numéricas.
printf("%s;%d\n", $tupla, $sequencias{$tupla});
}
}
}
... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)