Utilisation d'une variable

Fermé
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012 - 3 oct. 2003 à 01:20
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012 - 11 oct. 2003 à 17:33
Bonsoir,

Je suis en train d'apprendre l'utilisation de variables dans une fonction
Je dois faire une fonction pour trier un fichier et je dois passer un argument pour indiquer le champ a trier.

Je sais pas comment le faire... au lieu de dire le champ 4 je devrais mettre la variable.
sort -t: -nk4 fichier

merci beaucoup d'avance...

Lucila




Lucila

10 réponses

asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
3 oct. 2003 à 01:43
Salut Lucy,

Je ne suis pas sûre d'avoir bien compris la question, mais je vais essayer de te répondre quand même :o)
[shell]# function tri ()
>{
>       sort -t: -nk$1 $2;
>}
[shell]# tri <le n° du champ sur le quel trier> <fichier à trier>

$1, $2 represente les arguments 1 et 2 passsés à la fonction.

Voili voilou, ca marche bien Mais je ne sais pas si c'est ce que tu attendais :-)
@++

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012
3 oct. 2003 à 02:27
Merci !!!! :o)) oui c'etais exactement ca ma question et ca marche comme ca....

Mais je crois que j'ai pas su poser la question :o( pardon...

Je dois afficher les champs nom du fichier, taille, js.modification et js.acces d'un repertoire (celui-ci je vais le passer comme parametre).
Je dois passer comme parametre de la fonction aussi le champ a trier.

Ca c'est la commande que j'ai fait, mais comment eviter de confondre les parametres de la fonction avec les autres parametres. Je voudrias a la fin ecrire sort -nkvariable, si je ecris sort -nk$3 ca marche pas.:

find /root -printf "%p:%s:%T@:%A@\n" | awk -F ":" -v dj=$(date "+%s") '{print $1":"$2":" int((dj-$3)/(3600*24))":" int((dj-$4)/(3600*24) )}' | sort -nk3 -t:

Lucy
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
3 oct. 2003 à 03:12
Re-Salut,

Si tu n'as que deux parametres à rentrer (le dossier et le champ pour le tri, tu utilises $1 et $2)

[shell]# tri () { find $1 -printf "%p:%s:%T@:%A@\n" | 
awk -F ":" -v dj=$(date "+%s") '{print $1":"$2":" int((dj-$3)/(3600*24))":" int((dj-$4)/(3600*24) )}'|
sort -t: -nk$2; }
[shell]# tri nom_dossier num_champ

Les $1 et $2 en gras, sont les deux variables passées à ta fonction les autres sont celles de awk, mais étant donné que toutes ces variables n'ont qu'une portée locale, ca ne gène en rien le fonctionnement...

Dis moi si ca marche, chez moi à ca l'air de fonctionner correctement ;-)

@++
"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012
3 oct. 2003 à 03:40
Ouiiiiii !!!! ca marche !!!! :o))
et moi, j'ai cherche la reponse pendant toute la soir :o)... j'etais confuse
Je te remercie... c'est mon TP que je suis en train d'avancer et je dois remettre ce lundi.
Merci encore ! :o)
Lucila
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
3 oct. 2003 à 03:41
De rien :o)

@++

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012
3 oct. 2003 à 04:20
Lucila
0
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012
3 oct. 2003 à 04:25
Ma fonction est maintenant :
tri(){ find $1 -printf "%p:%s:%T@:%A@\n" | awk -F ":" -v dj=$(date "+%s") '{print $1":"$2":" int((dj-$3)/(3600*24))":" int((dj-$4)/(3600*24) )}' | sort -nk$2 -t: | awk -F: '{printf ("|%-50s|%8s|%8s|%8s|\n",$1,$2,$3,$4)}';}

Parfois, les nom des fichiers sont de longueur plus grande que 50. Il y a un facon pour afficher le champ "nom" (le premier) en plusieurs lignes dans ces cas? C'est pour ameliorer la presentation...
Merci,

Lucy
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
4 oct. 2003 à 00:01
Bonsoir,

Bon j'ai trouvé un truc qui pourrait t'interesser, la commande showtable.
Mais il Faut l'installée si elle n'est pas presente, c'est le package:
perl-Data-ShowTable-3.3-7mdk

ensuite tu n'a plus qu'à remplacé ton dernier appel à awk:
awk -F: '{printf "|%-50s|%8s|%8s|%8s|\n",$1,$2,$3,$4)}')
par
showtable -d: -ti=titre1,titre2,titre3,titre4 -w=80

Tu auras un tableau sur 80 colones en largeur avec en plus les titres pour chaque champs!
(titre1 à 4 que tu peux biensur changer à souhait :o))
("man showtable" et "man Data::ShowTable" pour plus d'infos)
Par contre tu ne peux pas rediriger la sortie vers un fichier :-(

Il doit y avoir d'autre possibilitées, mais beaucoup plus complexes a mettre en oeuvre


"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
4 oct. 2003 à 00:03
voilà la suite...

tri()
{ 
    find $1 -printf "%p:%s:%T@:%A@\n"
    | awk -F ":" -v dj=$(date "+%s") '{print $1":"$2":" int((dj-$3)/(3600*24))":"
    int((dj-$4)/(3600*24) )}'
    | sort -nk$2 -t:| showtable -d: -ti=titre1,titre2,titre3,titre4  -w=80 ;
}


voili, voilou!

Bon Week End
@+

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
4 oct. 2003 à 02:08
Re,
En fait, il suffisait de bidouiler un peut ton dernierappel à awk.
Bon c'est sans doute pas du tout optimisé, mais ca marche:
awk -F: '
           BEGIN { b=" " };
           BEGIN{ print "+--------------------------------------------------+--------+--------+--------+" };
           { i=0 }; 
           { str=$1 };  
           { while ( length(str)>50 )
             {
                 sc=substr(str,1,50);
                 i+=51; 
                 str=substr($1,i,length($1)); 
                 printf ("|%-50s|%8s|%8s|%8s|\n",sc,b,b,b)
              } 
            }; 
            { printf ("|%-50s|%8s|%8s|%8s|\n",str,$2,$3,$4) };
            END { print "+--------------------------------------------------+--------+--------+--------+" }'


@+
"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012
4 oct. 2003 à 19:27
Merci beacoup,
je viens de lire ta reponse... hier j'ai verifie et j'en avait pas aucune....
Je vais verifier si j'ai le packetage est installe sur mon ordi... je crois que la 2e facon ca va marcher... sinon, je te raconterai apres... :o)

Lucy
0
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
5 oct. 2003 à 02:00
Oki :)

@++

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
lucygr Messages postés 31 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 26 avril 2012
11 oct. 2003 à 17:33
Ma fonction a resulte comme ca, je la laisse pour si ca peut interesser a qqn.
Ca donne la liste de fichiers du repertoire qu'on a passe comme parametre, si il n'y a aucun argument, il donnde le repertoire de root.

liste_fichiers(){ case $# in 1) x1=$1;x2=2;;2) x1=$1;x2=$2;;0) x1=$(pwd);x2=2;;-ge3) x1=$(pwd);x2=2;;esac; ligne="--------------------------------------------------------------------------------";echo " Liste des fichiers";echo $ligne;echo "|Nom |Taille O.|Modif.js|Acces js|";echo $ligne; find $x1 -printf "%p:%s:%T@:%A@\n" | awk -F":" -v dj=$(date "+%s") '{print $1":"$2":"int((dj-$3)/(3600*24))":"int((dj-$4)/(3600*24))}'| sort -t: -nk$x2 > fichier ; awk -F":" '{while (length($1)>50) {printf("|%-50s|%9s|%8s|%8s|\n",substr($1,1,50)," "," "," "); $1=substr($1,51)} printf("|%-50s|%9s|%8s|%8s|\n",$1,$2,$3,$4)}' < fichier;echo $ligne;echo "Recapitulatif";echo "Nombre de Fichiers = " $(wc -l fichier); echo "Espace Globale = " $(du -s -b < fichier)"Octets " $(du -s -k < fichier)"K.octets " $(du -s -h < fichier)"Octets";}

Merci beaucoup pour l'aide.
A bientot,
Lucila
0