Utilisation d'une variable

lucygr Messages postés 32 Statut Membre -  
lucygr Messages postés 32 Statut Membre -
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 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
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 32 Statut Membre
 
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 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
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 32 Statut Membre
 
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 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
De rien :o)

@++

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
lucygr Messages postés 32 Statut Membre
 
Lucila
0
lucygr Messages postés 32 Statut Membre
 
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 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
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 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
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 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
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 32 Statut Membre
 
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 13095 Date d'inscription   Statut Webmaster Dernière intervention   426
 
Oki :)

@++

"Si c'est stupide et que ça marche,
        alors ce n'est pas stupide"
0
lucygr Messages postés 32 Statut Membre
 
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