Pages : 1
#1 Le 25/06/2023, à 10:28
- roland04
[Résolu] programme awk
Bonjour,
Nouveau sur ce site je ne suis pas sûr que ce message soit au bon endroit !
Voici ma question :
J'ai réalisé un petit programme bash listant les entiers premiers jusqu'à un entier n saisi en ligne de commande. ceci grâce à des commandes awk.
Ma seule façon de le faire fonctionner est d'utiliser ce programme bash contenant la ligne ci-dessous (ça fonctionne) :
premiers.awk -v m=$1 | awk '$0 != ""{print}' | awk 'BEGIN{RS ="@"}{gsub(/\n/," ");print}'
(premiers.awk donne la liste désirée mais en colonne et avec des trous correspondant aux entiers non premiers. Les deux autres commandes awk permettent de chasser les lignes blanches puis de mettre sous la forme d'une ligne.)
J'aimerais me passer de ce programme bash pour avoir un seul programme awk qui réalise la ligne ci-dessus.
Je n'y arrive pas ! (connaissances insuffisante du langage awk sûr).
Merci d'avance.
Dernière modification par bruno (Le 26/06/2023, à 09:05)
Hors ligne
#2 Le 25/06/2023, à 11:45
- Watael
Re : [Résolu] programme awk
salut,
peux-tu nous décrire ce que fait premier.awk (.awk pour un script bash ) ?
affiche-nous le contenu du script.
PS : -v c'est plutôt généralement l'option courte pour --version
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#3 Le 25/06/2023, à 12:45
- roland04
Re : [Résolu] programme awk
Le premier awk fait l'essentiel : lister les entiers premiers inférieurs à un entier n, entré en ligne de commande après le nom du script bash ainsi :
$ liste_premiers.sh 12 (pour avoir les premiers inférieurs à 12). D'où le $1 dans la ligne du script bash.
Voici le programme awk lui-même (-v c'est pour déclarer une variable en ligne de commande avec awk ainsi :
$ programme.awk -v variable=quelquechose )
#!/usr/bin/awk -f
9 # définition de la fonction pr qui affiche les entiers premiers inférieurs ou égaux à l'entier m
10
11 function pr(n, i)
12 {
13 if(n == 0 || n == 1)
14 n=""
15
16 if(n % 2 == 0 && n > 2)
17 n=""
18
19 for(i=3; i*i <= n; i+=2)
20 {if(n % i == 0)
21
22 n=""
23 else
24 continue}
25 print n }
26 # fin de la fonction pr
27
28 # usage de la fonction pr
29 BEGIN{for(i=1; i<=m; i++)
30 {print pr(i)}}
Merci
En fait il n'y a pas de problème avec le programme lui-même ni avec les deux autres commandes awk, ça marche très bien. Ce que je ne sais pas faire c'est un programme unique en awk qui ferait l'équivalent de cet enchaînement des trois commandes (qui se fait bien grâce à bash).
Dernière modification par Nuliel (Le 25/06/2023, à 13:42)
Hors ligne
#4 Le 25/06/2023, à 12:52
- xubu1957
Re : [Résolu] programme awk
Bonjour,
Pour ajouter toi-même les balises code à ton précédent message #3 : Merci
Cliquer sur le lien « Modifier » en bas à droite du message
Sélectionner le texte
Cliquer sur le <> de l'éditeur de message
comme indiqué dans le : Retour utilisable de commande
Dernière modification par xubu1957 (Le 25/06/2023, à 14:18)
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
Hors ligne
#5 Le 25/06/2023, à 14:17
- Watael
Re : [Résolu] programme awk
#!/usr/bin/awk -f
# définition de la fonction pr qui affiche les entiers premiers inférieurs ou égaux à l'entier m
function pr(n, i)
{
if(n == 0 || n == 1) n=""
if(n % 2 == 0 && n > 2) n=""
for(i=3; i*i <= n; i+=2){
if(n % i == 0)
n=""
else
continue
}
return n
} # fin de la fonction pr
# usage de la fonction pr
BEGIN{
for(i=1; i<=m; i++){
prems = pr(i)
if (prems) printf("%d ",prems)
}
print
}
on peut améliorer l'affichage en passant par un tableau et en itérant sur len(tablo)
Dernière modification par Watael (Le 25/06/2023, à 18:05)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#6 Le 25/06/2023, à 17:49
- roland04
Re : [Résolu] programme awk
@Watael
Merci, c'est parfait. Je n'ai encore jamais utilisé return, je vais aller voir de plus près le manuel Gawk ! Mes tentatives pour modifier les actions dans BEGIN avaient toutes échoué.
@xubu1957
Ok et merci.
Hors ligne
#7 Le 26/06/2023, à 08:50
- roland04
Re : [Résolu] programme awk
@Watael
Je reviens sur ta dernière phrase : "on peut améliorer l'affichage ...".
En fait je n'avais pas vu la modification "tableau", je comprends !
Merci encore (j'ai vu que c'était mon print dans la fonction qui a compliqué les choses, le return résout le problème).
Hors ligne
#8 Le 26/06/2023, à 08:56
- roland04
Re : [Résolu] programme awk
@xurub1957
Le temps que ça monte au cerveau ... Je viens de piger pourquoi ta phrase barrée et le merci avec l'émoticon !
Merci d'avoir fait la modif pour moi !
Hors ligne
#9 Le 26/06/2023, à 12:51
- roland04
Re : [Résolu] programme awk
Encore une question
...améliorer l'affichage en passant par un tableau...
C'est à dire : utiliser un "array" du langage awk ?
Hors ligne
#10 Le 26/06/2023, à 12:57
- xubu1957
Re : [Résolu] programme awk
Bonjour,
C'est Nuliel (modérateur) qui a mis les balises code (Hier à 14h42).
Conseils pour les nouveaux demandeurs et pas qu'eux
Important : Pensez à passer vos sujets en [Réso|u] lorsque ceux-ci le sont, au début du titre en cliquant sur Modifier sous le premier message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci. Membre de Linux-Azur
Hors ligne
#11 Le 26/06/2023, à 13:08
- roland04
Re : [Résolu] programme awk
Merci Nuliel donc !
Hors ligne
#12 Le 26/06/2023, à 14:55
- Watael
Re : [Résolu] programme awk
oui, un array awk.
actuellement, le programme affiche un espace à la fin de la ligne ('%d ').
en bouclant sur le nombre d'éléments d'un tableau, on sait quand on arrive à la fin du tableau qu'à la place d'un espace il faut mettre un retour à la ligne.
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#13 Le 26/06/2023, à 16:01
- roland04
Re : [Résolu] programme awk
@Watael
Merci !
Hors ligne