Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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 hmm ) ?
affiche-nous le contenu du script.

PS : -v c'est plutôt généralement l'option courte pour --version wink


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           wink

  • Cliquer sur le lien « Modifier » en bas à droite du message

  • Sélectionner le texte

  • Cliquer sur le <> de l'éditeur de message

Balisesmoko138.jpg

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

Watael a écrit :

...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