Traduire un algo en shell

souna -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,


j'ai fais une petite partie d'algorithme pour la réalisation d'un projet mais je n'ai jamais programmé sur shell et du coup je ne sais pas comment traduire mon algo en shell script
(
Je crée un fichier .txt qui contient les noms des fichiers de la cat. A et un autre contenant les noms de fichiers de la cat. B (un nom par ligne)
compteur i <- EOF B <- nbre_lignes de fichier B
compteur j <- EOF A <- nbre_lignes de fichier A

...
...
...

Pour i=1 jusqu'à "EOF B" faire
titreB <- ligne(i) du fichierB

Pour j=1 jusqu'à "EOF A" faire
titreA<- ligne(j) du fichierA

cat titreB titreA > resultat
gzip resultat > resultat.gz
enregistrer titreB titreA taille_resultat.gz > Tailles.txt
rm resultat.txt; rm resultat.gz

cat titreA titreB > resultat
gzip resultat > resultat.gz
enregistrer titreA titreB taille_resultat.gz > Tailles.txt
rm resultat.txt; rm resultat.gz

Fin pour
Fin pour
...
...
...
)
y a-t-il qqn qui peut m'aider et m'expliquer comment ?
Merci d'avance
A voir également:

2 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Remarques préliminaires :
- Commence par lire un cours sur bash (cf google) pour apprendre à écrire les blocs algorithmiques :
https://linuxconfig.org/bash-scripting-tutorial

- L'opérateur > (qui en réalité est 1>) écrit à la place d'un fichier (et le crée si besoin). L'opérateur >> (en réalité 1>>) écrit à la suite d'un fichier. C'est celui ci que tu dois utiliser.

echo "bonjour !" 1> coucou.txt # écrase le contenu de coucou.txt
echo "pouet" 1>> coucou.txt # écrit à la suite
echo "plop" 1>> coucou.txt
cat coucou.txt


- Pense à utiliser le man. Ainsi tu verras que gzip ne s'utilise pas comme tu l'as fait :

man gzip


(q pour pour quitter). En fait ce serait plutôt

# produit toto.gz à partir de toto
gzip toto


Bonne chance
1
al_right Messages postés 141 Date d'inscription   Statut Membre Dernière intervention   9
 
En perl qui est installé sur toutes les distribution par défaut tu peux faire comme ceci.

(colle le script dans un fichier et rend les exécutable
(chmod =x script.pl))


#!/usr/bin/perl     

# ouverture fichierA, lecture, stockage contenu et fermeture     
$fa = "fichierA.txt";     
open FA, "$fa" or die "Ouverture de $fa impossible $!";     
@fileA = <FA>;     
close FA || die "fermeture de $fa impossible $!";     

# pareil pour le fichierB     
$fb = "fichierB.txt";     
open FB, "$fb" or die "Ouverture de $fb impossible $!";     
@fileB = <FB>;     
close FB || die "fermeture de $fb impossible $!";     

# traitement files A, recherche titre et nombre de lignes     
foreach $l(@fileA) {     
 chomp;     
 next if /""/;     
 $filename = $l;     
 print "ceci est filename $filename\n";     
      
 open AF, "$filename" or die "Ouverture de $filename impossible $!";     
 @fA = <AF>;     
 close AF || die "fermeture de $filename impossible $!";     
      
 my $i = 0;     
 foreach (@fA) {     
  if($i = 0) {     
   $titreA = $_;     
   $compteurj++;     
   $i++;     
   }     
  else {     
   $compteurj++;     
   $i++;     
   }     
  }     
 push @titreA, $titreA;     
 push @nbrligneA, $compteurj;     
 $titreA = "";     
 $compteurj = 0;     
 }     
      
# traitement des file B et recherche du titre et nbr de lignes     
foreach (@fileB) {     
 chomp $_;     
 $filename = $_;     
 open BF, "$filename" or die "Ouverture de $filename impossible $!";     
 @fB = <BF>;     
 close BF || die "fermeture de $filename impossible $!";     
      
 my $i = 0;     
 foreach (@fB) {     
  if($i = 0) {     
   $titreB = $_;     
   $compteuri++;     
   $i++;     
   }     
  else {     
   $compteuri++;     
   $i++;     
   }     
  }     
 push @titreB, $titreB;     
 push @nbrligneB, $compteuri;     
 $titreB = "";     
 $compteuri = 0;     
 }     
      
# traitement resultat titre B nbr ligne, titre A nbr ligne     
$resultat = "./resultat.txt";     
open RES, ">$resultat" or die "err ouverture de $resultat $!";     
print RES "traitement des fichiers A et B et nombre de lignes\n";     
$nmbenreg = @titreB;    
for ($i = 0, $i++, @nmbenreg) {     
 my $titreA = shift @titreA;     
 my $compteurj = shift @nbrligneA;     
 my $titreB = shift @titreB;     
 my $compteuri = shift @nbrligneB;      
 print RES "titre B: $titreB\tnbr ligne: $compteuri | titre A: $titreA\tnbr ligne: $compteurj\n";     
}     
close RES || die "fernmeture de $resultat impossible $!";     

# script testé, alain     
END;



ça y est, je l'ai testé, ça ne risque rien

J' aurai pu l'écrire sur quelques lignes mais c'est pour expliquer que j'ai développé tout.



(sh ash bash csh ksh zsh = ligne de commande du système que tu dispose (pour linux c'est le bash Bourne again shell))


[_Al_right_] [8O°) [8O*) [8o. |8*) |:o. [8. [8O{'} [8O°)
========== [_a____l_a_i_n__] ** **
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Mwais je suis pas persuadée que perl soit justifié pour un truc si simple... surtout si le script n'est pas testé et si on te demande explicitement du shell...

Mais toutefois, merci pour ta contribution ;-)
0