bonjour a tous,

je cherche une commande depuis 2 jours concernant le traitement d'un fichier texte et je suis bloqué.

a 'lavance je précise que j'ai épluché les man de grep, cat, sed et awk, sans jamais trouver une solution.
Je m'explique :
je voudrais pouvoir a l'aide d'une commande numeroter les lignes d'une d'un fichier.
et ensuite, je voudrai pourvoir stocker dans un tableau les multiples mots d'une ligne appelée par son numero.
Grep me propose la commande de numerotation, ainsi que cat (sed le faisais avec une commande que j'avais noté, mais ne fonctionne plus (peut-être parce que j'ai changé de version de kernel ou une evolution de la commande....).

l'ideal pour moi serait de pouvoir d'un coté savoir combien il y a de lignes dans le fichier (ca j'y arrive, ok), puis je voudrai pouvoir rappeler une des lignes numérotées et stocker les mots qui la composent dans un tableau avec : TABLEAU=( $(la commande a trouver) ).

Mais la je seche, et je trouve rien sur le net.


Si vous avez des idées, d'avance merci....
bonsoir, tu as juste a continuer en awk comme je suppose que c'est ce que tu as fais pour numéroter tes lignes, utilise les motifs et utilise FS=" " dans ton begin ou alors tu utilise NF pour compter le nombre d'enregistrement sur ta ligne qui sont séparés par des espaces...

Sinon tu cherches dans les getline from file pour awk

edit : c'est en anglais mais ya rien de plus simple =)

Sinon pour les variables système : la c'est en français
a basic,

merci pour ces infos, mais la je crois que ca me depasse,
quand je dis que j'y arrive avec awk, j'utilise juste la cmd :"cat -n mon_fichier".
j'ai bien lu des indos sur le "FS=" et le "BEGIN" ou le "NF", mais jamais utilisé.
je vois tes liens et je te tiens au courant, merci deja pour ces liens

(maintenant, l'anglais et moi, ca fait au moins trois......)

@+++++
a basik,
desole pour l'erreur sur ton pseudo dans le mot précédent.

je viens d'essayer une commande indiquée ici

et ca ne fonctionne pas.

j'ai meme suivi ca et j'ai monté le script pour tester, mais toujours rien.

pourrais-tu me filer coup de main STP ?????
Salut,

As-tu essayé en Perl (pas très compliqué et pratique pour les chaines) ?
Ou alors un simple :
cat <ton fichier> | head -n <le numéro de la ligne que tu veux> | tail -n 1 | cut -d' ' -f<le numéro du mot dont tu as besoin>
?
a daneel,

ok, je viens d'essayer ta commande.

elle va jusqu'a donner directement le mot voulu. SUPER

ta commande va meme trop loin pour ce que je veux faire, "cat mon_fichier | head -n '1'" suffisait, mais merci bien, je note ta commande qui est plus perfommante.

Merci encore

P.S. : comment je fais pour dire que ce fil est résolu ??
Euh, "cat mon_fichier | head -n 1" ne te donne que la première ligne du fichier.

Je t'explique un peu (j'aurais du le faire avant mais bon) :
head te renvoie un nombre de ligne (par défaut 10) du début de l'entrée standard.
tail te renvoie un nombre de ligne (par défaut 10) de la fin de l'entrée standard.

Donc dans "cat <ton fichier> | head -n <le numéro de la ligne que tu veux> | tail -n 1",
"cat" passe ton fichier sur la sortie standard,
"head" en affiche les x première lignes
et "tail -n 1" te renvoie seulement une ligne.

D'ailleurs tu peux raccourcir un peu en utilisant : "head -n <le numéro de la ligne que tu veux> <ton fichier> | tail -n 1".

Pour le reste "man" est ton ami...

Pour la modification du titre de ton post je crois que tu as deux heures pour le faire en modifiant ton premier message. Mais si tu ne peux pas ce n'est pas très grave.
a daneel,

merci pour l'explication, je me suis apercu de mon erreur en meme temps que tu me l'expliquais.
Mais je bute toujours sur un souci, j'explique :
j'ai un fichier avec ces données :

admin : fredouille
user : fhemon toto tata

l'idée, et ta commande n'est pas trop loin, c'est une commande qui me donnes en fonction de la ligne choisie la liste des utilisateurs repertoriés dans le groupe admin ou user.

le souci que je rencontre, est que des que j'essais d'automatiser ca deconne.
j'essais d'automatiser avec ca :

numero_groupe=2 (a modifier en fct de la ligne voulue)
echo "les utilisateurs sont :"
i=3
while [ $i -eq "100" ]
do
cat $fichier_group | head -n $numero_groupe | tail -n 1 | cut -d' ' -f $i
i=$i+1
done

et la je vois pas ou je deconnes.......

si tu as une idée
Bon j'ai un peu retoucher ton script (désolé je n'ai pas pu m'en empêcher) :
#!/bin/bash
fichier_group="utilisateurs"
numero_groupe=2
echo "les utilisateurs sont :"
i=3
while [ $i -lt "100" ]
do
    utilisateur=`head -n $numero_groupe $fichier_group | tail -n 1 | cut -d' ' -f$i`
    if [ ${#utilisateur} -gt 0 ]; then
        echo "$utilisateur"
    fi
    i=`expr $i + 1`
done
${#utilisateur} : c'est le nombre de caractères dans la variable.
i=`expr $i + 1` : c'est pour incrémenter effectivement $i.

Le problème venait de ta boucle :
while [ $i -eq "100" ]
Ça boucle tant que i est égale à 100, or tu initialise i à 3...
Désolé hier soir j'étais en plein dev sous M$ donc je n'avais pas mon shell sous les yeux. Je ne connais pas perl j'ai juste fais du bash, awk et sed jusqu'à présent et ça m'a toujours suffit.

Bonne continuation
1. Ne jamais utiliser de `backquotes'. Au lieu de `foo`, ecrivez $(foo).
2. cat foo|head == head foo == head < foo
3. [ ${#utilisateur} -gt 0 ] -> [ -n "$utilisateur" ]
4. Au lieu de forker un expr, tu peux faire built-in : i=$(($i+1))
5. Les references aux variables doivent etre mise en double-quotes. "$fichier_group", "$numero_groupe"
6. Au lieu de gerer l'increment de i manuellement, for i in $(seq 3 100)

Mais gerer ca comme ca, c'est juste un hack. Tu pourrais avoir une ligne avec plus de 100 champs.
Ce que tu veux, c'est faire un sed a la place du cut pour virer le debut de ligne.
1. Pourrais-tu expliquer pourquoi, histoire que je m'instruise un peu, là j'ai du mal à comprendre...
3. J'avais testé [ -n "$utilisateur" ] et, voyant le résultat, je me suis rabattu sur [ ${#utilisateur} -gt 0 ]...
4. Très juste, aucune excuse.
5. Pareil.
6. Pratique, je ne connaissais pas, je me le note dans un coin...
a daneel,

Merci pour la retouche du script, et je suis d'accord pour mon erreur de boucle
while [ $i -eq "100" ]
je me suis apercu de mon erreur cette nuit en y repensant (comme quoi j'aurai du tourner 7 fois mes yeux avant de poster :-D ).

a Anvil,

1 : qu'est-ce que "backnotes" et foo (ou "$foo"), quelle est la difference ??
2 : si ca peux me donner la valeur que je veux, ok.
3 : je vais essayer après le script de daneel, mais si tu le dis....
4 : pour forker ??? et "i=$(($i+1)) je vais essayer mais je vois pas ou est la subtilité (j'avais jamais vu ca dans un script ou tuto).
5 : merci pour l'info des double quotes (quoi que je vois pas la différence ou la subtilité).
6 : la ca depasse mon niveau, qu'est ce que $(seq 3 100) ??? le debut de boucle et la limite, peut-être ? je vais essayer.

a l'ideal, oui j'espérais que sed aurait pu me donner le resultat, en virant le debut de ligne et en me laissant la possibilité de lire chacun des utilisateurs d'un groupe, mais individuellement...

Réellement, l'idée du script est de pouvoir gerer les utilisateurs du serveur que je suis en train de monter, je sais que c'est deja disponible avec adduser, addgroup et le reste, meme si je ne sais pas m'en servir autrement qu'en graphique (donc y a du boulot), mais vu que j'ai plein de choses a apprendre sur les commandes, linux, la console et le reste, je me dis que tant qu'à faire autrement essayer de faire cela directement avec la console, depuis un script avec dialog comme ca je cherche et j'apprends.

je suis dejà arrivé a faire ce que je voulais pour la gestion des groupes du fichier (creer, effacer, renommer) depuis la console, et je voudrais y arriver de meme pour les utilisateurs.
Ensuite je verrais pour gerer les droits des groupes et/ou utilisateurs individuellement et j'essayerais d'aller egalement ecrire dans la conf de mon serveur.

d'ailleurs j'ai prévu de proposer au nouvel utilisateur de mon serveur de pour creer son login, son mdp, pas gerer son groupe, directement en ligne.
Donc l'idée après c'est de voir pour re-utiliser ce 1er script pour l'adapter au serveur, en passant par des scripts .cgi (je crois que c'est dans ce format, mais pas sur).

Donc y a du boulot.

Et la je dois dire que toutes vos idées seront les bienvenues,...........

pour l'instant j'arrive a faire tourner mon serveur avec des utilisateurs deja identifiés et ils peuvent uploader, meme si je trouve que c'est dès que le fichier commence a etre volumineux, ca rame, mais avant de me lancer dans la modification du script que proxy m'a transmis, je voudrais deja arriver a faire ce que je veux depuis une console.
1. Pourrais-tu expliquer pourquoi, histoire que je m'instruise un peu, là j'ai du mal à comprendre...
Concretement les 2 ont le meme role. Mais les `` sont une source d'emmerdes. Deja, ` se confond avec '. Ca aide pas. Ensuite, demande-toi laquelle de ces 2 imbrications te parait la plus naturelle :
[anvil@gruyere ~]$ echo `echo \`echo \\\`echo foo\\\`\``
foo
[anvil@gruyere ~]$ echo $(echo $(echo $(echo foo)))
foo
Et ca, c'est encore facile a comprendre. L'orgie d'antislashes, franchement, ca nuit a la lisibilite. $() est la recommandation POSIX. `` est un vestige du passe. N'ecrivez plus de ``.
4 : pour forker ??? et "i=$(($i+1)) je vais essayer mais je vois pas ou est la subtilité (j'avais jamais vu ca dans un script ou tuto).
5 : merci pour l'info des double quotes (quoi que je vois pas la différence ou la subtilité).
Va falloir lire le man de ton shell, alors. Autant le 1er a peu d'interet en soi, autant le second point est crucial dans la comprehension du shell.
6 : la ca depasse mon niveau, qu'est ce que $(seq 3 100) ??? le debut de boucle et la limite, peut-être ? je vais essayer.
Et le 'info seq' aussi.
je sais que c'est deja disponible avec adduser, addgroup et le reste, meme si je ne sais pas m'en servir autrement qu'en graphique
Donc, si je comprends bien, au lieu de lire 2-3 pages simplettes, tu preferes t'engouffrer dans l'ecriture d'un programme dans un langage dans lequel tu ne fais que balbutier ?
J'espere pour toi que ne nous sommes pas en train de parler du fichier /etc/group. Car tu commettrais une grave erreur. Il ne faut jamais editer brutalement ce fichier.
[note comme ça]Anvil a une tendance un peu "directe" mais il a rarement tort ... et pis là, il a raison! lol
Bref, sinon j'avoue qu'également j'ai pas trop compris pourquoi tu t'amuses à parser un fichier alors que quelques commandes peuvent sans doute te donner les infos que tu veux.[/note comme ça]
a Anvil,

Justement, ne voulant pas toucher au /etc/group du systeme, quand j'ai installé mon serveur :
- je n'ai pas eu a configurer un user du serveur avec adduser ou dans /etc/group,
- les groupes sont gérés dans un fichier autre.

j'ai dit que l'on pouvait surement le faire avec les commandes adduser et addgroup, mais vu que les utilisateurs systemes sont completement séparés des utilisateurs virtuels, je pense que j'ai parlé trop vite encore une fois...... (je pensais surtout a un paquet qui, apres son install, avait planté tout le serveur, obligeant a une re-install, d'ou l'envie de le faire depuis une console).

Quant au fait de lire les man du shell et de sed, ok mais, j'ai beaucoup de mal a lire tout ca et surtout a le comprendre (quand c'est en anglais, merci).

Pour sed, j'ai bien lu 2 ou 3 fois le man et le info ausi mais sans trouver de proposition d'option qui m'aiderait dans ce que je veux faire (j'ai surement mal compris....)

maintenant, si les doubles quotes sont des " pourquoi on les appelles pas des guillemets ??
je sais qu'on est a l'aire de l'internationalité, mais bon l'anglais n'est pas universel......
a Anvil,

je vais d'essayer toutes tes propositions, et effectivement, c'st un petit peu plus compréhensible pour moi écrit comme ca.

Ceci étant, j'essais de mettre en place
2. cat foo|head == head foo == head < foo
et y a pas je n'y arrive pas.

j'ai essayé ca :
utilisateur=`cat "$numero_groupe" "$fichier_group" -f$i foo | head == foo == head < foo`
et ca :
utilisateur=`cat "$numero_groupe" "$fichier_group" foo | head == foo == head < foo -f$i`
et toujours rien.

pourrais-tu m'éclairer ???
@fredouille, Anvil voulait dire que cat foo | head est equivalent à head foo .... 🙂
mais bon l'anglais n'est pas universel......
Il l'est beaucoup plus que le francais en informatique.
a Anvil,

Je reconnais, je me suis emporté, désolé.................................

a proxy,

merci pour l'info, mais quand je fais :
utilisateur=`head == foo == head < foo $numero_groupe $fichier_group`
ou
utilisateur=`$numero_groupe $fichier_group head == foo == head < foo`
j'ai toujours la meme erreur :
]$ sh /home/fberard/Bureau/1
il y a 2 groupes
donner celui a afficher :
2
les utilisateurs sont :
/home/fberard/Bureau/1: line 12: foo: Aucun fichier ou répertoire de ce type