Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1857 connectés 

  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Extraire les lignes d'un fichier à partir d'un champ sans awk

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Extraire les lignes d'un fichier à partir d'un champ sans awk

n°1476906
environnem​entBash
Posté le 15-07-2022 à 23:17:24  profilanswer
 

Bonjour,

 

Je ne parviens pas à extraire, à partir d’un champ d’un fichier ‘livres’ ces différents enregistrements selon la catégorie choisie par la personne (j’ai déjà écrit la partie du script où il faut read la catégorie du livre souhaitée par une personne). Je ne dois pas utiliser de awk pour cet exercice… Merci à eux qui m’aideront.

 

Par exemple j’ai ceci,
Nom1:Prénom1:TITRE1:2000:BD
Nom2:Prénom2:TITRE2:2001:ROMAN
Nom3:Prénom3:TITRE3:2002:SCIENCES
Nom4:Prénom4:TITRE4:2003:BD
Nom5:Prénom5:TITRE5:2004:ROMAN
Nom6:Prénom6:TITRE6:2004:SCIENCES

 

Et à la fin de mon script, je dois créer un fichier dans lequel :
- la première ligne va m’indiquer la liste des auteurs (1re et 2e colonne) et titres de livres(3e colonne) de la catégorie (4e colonne)
- les lignes suivantes m’indiquent le nom de l'auteur(1re colonne)  ainsi que le titre des livres de la catégorie sélectionnée(3e colonne) , séparés par un -
- la dernière ligne indique le nombre de livres trouvés

 


Voici ce que j’avais essayé de faire :

Code :
  1. function creer_fichier {
  2. touch -p "/home/livres/$1"
  3. if grep -q "^$1:" /etc/group
  4. then
  5.  ls -l | head -1 /home/livres | cut -d: -f1,4 /home/livres
  6. elif
  7.  ls -l | tail -n+2 /home/livres | cut -d: -f1 "-" -f3 /home/livres
  8. else
  9.  ls -l | tail -1 /home/livres |
  10. fi
  11. }
  12. resultat=$(grep -l student/home/livres/*)


Message édité par environnementBash le 16-07-2022 à 19:27:18
mood
Publicité
Posté le 15-07-2022 à 23:17:24  profilanswer
 

n°1476917
kajoux
Posté le 16-07-2022 à 08:30:25  profilanswer
 

Oublie les grep, cut, etc. Si tu n'as pas le droit d'utiliser awk, c'est à faire en bash j'imagine, pour que ça ait un intérêt.
Donc la base c'est

Code :
  1. while IFS=':' read nom prenom titre annee categorie; do
  2.   ...
  3. done < /home/user/livres


À toi de remplir la boucle :)

n°1476925
environnem​entBash
Posté le 16-07-2022 à 15:10:02  profilanswer
 

Merci beaucoup pour cette aide précieuse :)

n°1476939
environnem​entBash
Posté le 16-07-2022 à 18:43:35  profilanswer
 

Bonjour à tous,
Votre retour concernant le script que je laisse ici en bas me serait d’une grande aide pour m’améliorer… La base prodiguée par Kajoux dans son dernier message m'a énormément aidé à revoir l'entièreté de mon script :)
Juste une précision, mon objectif ici est d’établir une liste qui reprend les auteurs et les titres des livres correspondant à une catégorie donnée (à partir d'un fichier livres.txt qui est déjà dans mon répertoire). J'essaie encore de trouver un autre moyen sans utiliser 'correspondance' à la fin de mon script...

 


Voici, au complet, le script que j’essaie de terminer… :

 
Code :
  1. #! /bin/bash
  2. echo
  3. echo "but : établir une liste qui reprend les auteurs et les titres des livres correspondant à une catégorie donnée"
  4. fich="home/user/livres.txt"
  5. chemin="home/user/livres.txt"
  6. #vérifie que le fichier contenant la liste des livres existe bien
  7. #vérifie si le chemin est fourni comme 1er arg à la cmd
  8. if [ -z "$1" ]
  9. then
  10. echo "Utilisation $0 <livres.txt>"
  11. echo "Aucun fichier input n'a été donné"
  12. exit 1
  13. fi
  14. #verifie si ce meme fichier existe
  15. if [ ! -f "$1" ]
  16. then
  17. echo "Le fichier $1 n existe pas"
  18. exit 2
  19. fi
  20. #demander à l'utilisateur quelle catégorie de livres ils souhaitait extraire
  21. read -p "Quelle catégorie souhaiteriez-vous extraire ?" cat
  22. #extraire ces livres du fichier et créer un fichier avec : le titre, la liste des livres et ensuite le nombre de livres extraits
  23. while read cat
  24. do
  25.        if [[ -z $cat ]]
  26.                    then
  27.                                echo
  28.                                echo "ligne contenant un tiret non traitée"
  29.                                continue
  30.        fi
  31.     # Récupérer les données des différents champs
  32. nom="$(echo "$cat" | cut -d";" -f1)"
  33. prenom="$(echo "$cat" | cut -d";" -f2)"
  34. titre="$(echo "$cat" | cut -d";" -f3)"
  35. annee="$(echo "$cat" | cut -d";" -f4)"
  36. categorie="$(echo "$cat" | cut -d";" -f5)"
  37. # Compter le nombre de livres
  38. #créer le fichier reprenant titre liste de livres et nombres de livres extraits
  39. IFSold="$IFS"
  40. IFS=':'
  41. while IFS=':' read nom prenom titre annee categorie
  42. do
  43.  touch -p "/home/livres/$1"
  44.  "$cat" = "$1" && echo "correspondance \"$categorie\" : $nom $prenom $titre $annee"
  45. done <"$chemin/$fichier"
  46. done
 

Merci de m'avoir lu :)


Message édité par environnementBash le 16-07-2022 à 19:26:43
n°1476946
kajoux
Posté le 16-07-2022 à 23:24:27  profilanswer
 

Prends le temps d'écrire un algorithme avant de te lancer dans le codage.
Il ne doit rien y avoir d'autre, après avoir récupéré la catégorie cible auprès de l'utilisateur, que la boucle while donnée plus haut.
Tout doit se passer à l'intérieur, au fur et à mesure de la lecture des données.


Message édité par kajoux le 16-07-2022 à 23:24:49
n°1476950
environnem​entBash
Posté le 17-07-2022 à 01:14:56  profilanswer
 

J'ai bien entendu tenté d'écrire un algorithme avant de me lancer dans le code, seulement je ne sais pas quelle boucle conviendrait le mieux pour cette situation :
Par exemple, il se peut que (je cite des chiffres au hasard) chaque jour au-moins 500 personnes demande la liste de 'ROMAN', au-moins 200 personnes qui demandent 'BD' et au-moins 350 personnes qui demandent 'SCIENCES', où il faudra donc créer (toujours pour cet exemple) au-moins 1150 fichiers chaque jour. chaque fichier ayant un nom unique et spécifique à chaque personne ayant choisi une cat (meme si plusieurs on demandé la meme cat)... Et ainsi de suite pour les jour qui suivent.
 
J'espère avoir été précis dans cet exemple.

n°1476952
kajoux
Posté le 17-07-2022 à 07:38:42  profilanswer
 

Commence par résoudre le problème pour une requête, comme tu te proposais de le faire au départ, et ne change pas ton objectif en cours de route :)
Quand tu auras fait ça, tu pourras appeler ce programme autant que tu veux pour répondre à d'autres requêtes.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Linux et OS Alternatifs
  Codes et scripts

  Extraire les lignes d'un fichier à partir d'un champ sans awk

 

Sujets relatifs
Convertire des fichier .bin vers .txt et traitmentRestaurer un system à partir archive
Openmediavault-systeme de fichier[LINUX] Extraire les lignes d'un fichier à partir d'un champ avec grep
Le fichier texte xxx semble être un script exécutable.Lister répertoires ne contenant pas un type de fichier ?
Plus de sujets relatifs à : Extraire les lignes d'un fichier à partir d'un champ sans awk


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR