Pos de la ligne la plus longue

Fermé
kiki - 5 juil. 2011 à 00:28
mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 - 5 juil. 2011 à 00:57
Bonjour,
voici un programme awk
#!/usr/bin/awk
BEGIN{n=4
}
END{
NR==3
s= $0
NR==2
x= $0
printf("%d\n",length(s))
printf("%d\n",length(x))
}
ce programme doit m'aficher le nombre de caractere et la position de la ligne la plus longue d'un fichier contenant 3 ligne(ce fichier s'apelle fich1 et se situe sur le bureau)
OR en tapant la ligne d'execution du prog dans le terminale(/usr/bin/awk -f exos2.awk /home/mina/Bureau/fich1) , le terminal m'afiche 5 5
sachant que mon fichier fich1 sela ligne
qu'est ce qui me manque pour que le programme fait mon objectif
sil vous plais c'est urgent
merci





A voir également:

1 réponse

mamiemando Messages postés 33432 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 16 décembre 2024 7 809
5 juil. 2011 à 00:57
Personnellement j'utiliserais plutôt la built-in awk length() appliquée à $0, un bloc BEGIN pour initialiser les variables (ligne et longueur).

Je pense aussi que tu dois revoir la syntaxe awk et la manière dont architecturer ton code.

1) BEGIN : initialiser les variables : ici longueur et ligne, qui mémorisent la ligne qui t'intéresse et sa longueur.

2) Les blocs de traitement. Ici c'est pour toutes les lignes donc il y a juste un bloc sans expression régulière.

3) END : afficher le résultat.

Ainsi à ce stade on voit déjà que le code démarre comme ceci :

BEGIN {
  // On met des valeurs négatives pour que ce soit corriger
  // dès la lecture de la première ligne
  longueur = -1;
  ligne = -1;
}

{
  // Traitement
}

END {
  print longueur, ligne;
}


Maintenant reste à réfléchir sur le traitement en lui-même. Concrètement à chaque ligne que tu lis tu es susceptible de corriger la ligne et la longueur. La longueur tu l'as vu, consiste à utiliser length(). La chaîne qui nous intéresse est la ligne complète, donc c'est length($0).

Ensuite, il faut également corriger la ligne courante. On sait que celle-ci est mémorisée dans la variable NR, qui est corrigée automatiquement par awk à chaque fois qu'il lit une nouvelle ligne.

Maintenant, on ne veut faire cette mémorisation que si la ligne que l'on lit (length($0)) est plus longue que celle mémorisée jusqu'ici (longueur). On fait un tour dans l'aide de awk :

man awk


... et on s'aperçoit que le bloc if(...) { ... } va permettre de s'en sortir.

Je te laisse conclure pour voir si tu arrives à finaliser ton exercice afin que l'exercice t'apporte quelque chose... ça me paraît plus intéressant que de te donner la solution !

Bonne chance
0