Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 16/07/2022, à 23:18

environnementBash

en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Voici mon problème : je ne parviens pas à é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) En d’autres termes, je ne parviens pas à extraire, à partir du champ ‘categorie’, d’un fichier ‘livres’ les différents enregistrements correspondants à la catégorie de livres souhaitée par la personne.

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

À 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, au complet, le script que j’essaie de terminer… :

#! /bin/bash

echo
echo "but : établir une liste qui reprend les auteurs et les titres des livres correspondant à une catégorie donnée"
fich="home/user/livres.txt"
chemin="home/user/livres.txt"

#vérifie que le fichier contenant la liste des livres existe bien
#vérifie si le chemin est fourni comme 1er arg à la cmd
if [ -z "$1" ]
then
	echo "Utilisation $0 <livres.txt>"
	echo "Aucun fichier input n'a été donné"
	exit 1
fi

#verifie si ce meme fichier existe
if [ ! -f "$1" ]
then
	echo "Le fichier $1 n existe pas"
	exit 2
fi

#demander à l'utilisateur quelle catégorie de livres il souhaite extraire

read -p "Quelle catégorie souhaiteriez-vous extraire ?" cat

#extraire ces livres du fichier et créer un fichier avec : le titre, la liste des livres et ensuite le nombre de livres extraits

while read cat

do

       if [[ -z $cat ]]

                   then

                               echo

                               echo "ligne contenant un tiret non traitée"

                               continue

       fi

    # Récupérer les données des différents champs
	nom="$(echo "$cat" | cut -d";" -f1)"
	prenom="$(echo "$cat" | cut -d";" -f2)"
	titre="$(echo "$cat" | cut -d";" -f3)"
	annee="$(echo "$cat" | cut -d";" -f4)"
	categorie="$(echo "$cat" | cut -d";" -f5)"

	# Compter le nombre de livres
	#à faire 
	
	#créer le fichier reprenant titre liste de livres et nombres de livres extraits
	
	IFSold="$IFS"
	IFS=':'
	while IFS=':' read nom prenom titre annee categorie
	do
		touch -p "/home/livres/$1"
		"$cat" = "$1" && echo "correspondance \"$categorie\" : $nom $prenom $titre $annee"
	done <"$chemin/$fichier"

done

Dernière modification par environnementBash (Le 17/07/2022, à 00:03)

Hors ligne

#2 Le 16/07/2022, à 23:39

Watael

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 16/07/2022, à 23:47

MicP

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Bonjour

…Et à la fin de mon script, je dois créer un nouveau fichier (nommé au choix) dans lequel : …

Ça sera beaucoup plus simple pour toi de nous donner le contenu du fichier que tu souhaites obtenir à partir du fichier d'exemple que tu as déjà donné
plutôt que d'essayer de décrire litérallement le contenu du fichier que tu voudrais obtenir
et ça sera beaucoup plus facile pour nous de comprendre ce que tu cherches à obtenir

Dernière modification par MicP (Le 16/07/2022, à 23:50)

Hors ligne

#4 Le 17/07/2022, à 00:27

environnementBash

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Malheureusement je n’ai pas le fichier livres.txt sur cet ordinateur car l’ancien sur lequel il se trouvait est HS…
Ce que je souhaite par exemple, c’est si la cat souhaitée est ‘ROMAN’ (à partir du read) alors j’obtiendrais ceci :

Pour la 1re  ligne :
Nom2 Prénom2 TITRE2 2001 Nom5 Prénom5 TITRE5 2004

Pour la 2e  ligne :
Nom2 TITRE2 - Nom5 TITRE5

Pour la 3e  ligne :
2

Enfin, ces 3 lignes seront enregistrées dans un nouveau fichier (nom au choix).


En espérant que cela apporte de la clarté à mon explication car je suis perdu…

Hors ligne

#5 Le 17/07/2022, à 00:53

Watael

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

pourquoi faire ça :

read -p "Quelle catégorie souhaiteriez-vous extraire ?" cat

while read cat #pourquoi redemander, en boucle, la catégorie ?
do

la partie "#Récupérer les les données des différents champs" ne fonctionnera pas.

et

"$cat" = "$1" &&

il manque la commande test :

test "$cat" = "$1" &&

Ne cherche pas à améliorer le code que tu nous présentes, ce serait comme reconstruire une cabane avec du bois pourri (désolé pour l'image).
Tu dois t'appliquer à décrire, en langage naturel, l'enchaînement logique des opérations élémentaires (un algorithme), qui permettront d'obtenir le résultat souhaité,
et ensuite, seulement après, écrire le code. La description servira de commentaires décrivant les opérations du script.

Dernière modification par Watael (Le 17/07/2022, à 01:00)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#6 Le 17/07/2022, à 01:10

environnementBash

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Merci pour les remarques pertinentes. Je vais essayer d'apporter une précision qui pourra peut-être éclaircir mon problème pour ce script.

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.

Dernière modification par environnementBash (Le 17/07/2022, à 01:12)

Hors ligne

#7 Le 17/07/2022, à 01:19

jplemoine

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Déjà : pourquoi vouloir passer par un script bash et des "fichiers à plat" ?
Tu importes ton fichier "livres" dans une base de données (Donc, faire une vraie analyse : EBU, MCD et tutti quanti).
Puis faire un "mini-logiciel" d’interrogation (web + php par exemple).
S'il faut vraiment des "fichiers à plat" pour les statistiques, il suffira de les faire générer par le "mini-logiciel".


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#8 Le 17/07/2022, à 01:25

Watael

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

le script fonctionnera de la même manière quelle que soit le nombre d'exécutions.
l'unicité du fichier de sortie peut-être obtenue facilement avec mktemp.
il faudra nous en dire plus sur le mode d'interrogation du système  : qui interroge la DB, et comment ce "qui" accède au système ?

mais d'abord, faire fonctionner le script.
montre-nous ton algorithme.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#9 Le 17/07/2022, à 01:36

environnementBash

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

jplemoine a écrit :

Déjà : pourquoi vouloir passer par un script bash et des "fichiers à plat" ?
Tu importes ton fichier "livres" dans une base de données (Donc, faire une vraie analyse : EBU, MCD et tutti quanti).
Puis faire un "mini-logiciel" d’interrogation (web + php par exemple).
S'il faut vraiment des "fichiers à plat" pour les statistiques, il suffira de les faire générer par le "mini-logiciel".

Honnêtement merci ! smile
J'en prend bonne note de ces idées intéressantes qui me seront surement utiles pour les années qui viennent pour ma formation (je me forme depuis à peine un an et je verrai plus de choses l'année suivante...)

Le script dont il est question dans cette discussion est seulement un exercice que je ne suis pas parvenu à réaliser. Je suis obligé de passer par un script bash et des fichiers à plat, et sans utiliser awk ce qui me rend la tache compliquée depuis le début (lors de l'écriture de l'algo)

Hors ligne

#10 Le 17/07/2022, à 02:35

MicP

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Bonjour

Dans son message #6, environnementBash a écrit :

… chaque jour au-moins 500 personnes demande la liste de 'ROMAN' …

chacune de ces 500 personnes sera mise dans la liste des personnes associées à l'unique demande nommée ROMAM
donc, elles vont demander une copie du seul fichier contenant la liste de 'ROMAN'

Dans son message #6, environnementBash a écrit :

… au-moins 200 personnes qui demandent 'BD' …

chacune de ces 200 personnes sera mise dans la liste des personnes associées à l'unique demande nommée BD
donc, elles vont demander une copie du seul fichier contenant la liste de 'BD'

Dans son message #6, environnementBash a écrit :

… et au-moins 350 personnes qui demandent 'SCIENCES', …

chacune de ces 350 personnes sera mise dans la liste des personnes associées à l'unique demande nommée SCIENCES
donc, elles vont demander une copie du seul fichier contenant la liste de 'SCIENCES'

Finalement il n'y aura que 3 fichiers résultants des 3 demandes

et il y aura 3 listes de personnes <=> une liste de personnes pour chacune des 3 demandes
ce qui fera 1050 personnes qui recevront chacune une copie d'un de ces 3 fichiers résultants de ces 3 demandes
donc, 1050 fichiers de type lien

Dernière modification par MicP (Le 17/07/2022, à 10:36)

Hors ligne

#11 Le 17/07/2022, à 18:39

Ayral

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Watael a écrit :

Répondre à une question en renvoyant sur une discussion d'un forum extérieur, discussion où d'ailleurs les participants ne sont pas tout à fait d'accord, ce n'est pas une réponse pertinente pour la personne en quête d'informations.


Pour mettre les retours de commande entre deux balises code, les explications sont là : https://forum.ubuntu-fr.org/viewtopic.php?id=1614731
Blog d'un retraité
Site de graphisme du fiston Loïc
Ubuntu 22.04 LTS sur un Thinkpad W540

Hors ligne

#12 Le 17/07/2022, à 18:49

Watael

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

ce n'est pas à environnementBash que je m'adressais mais aux aidants, afin qu'ils sachent ce qui a été déjà dit.

pas cordialement.

Dernière modification par Watael (Le 17/07/2022, à 21:24)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#13 Le 17/07/2022, à 21:12

environnementBash

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

MicP a écrit :

Bonjour

Dans son message #6, environnementBash a écrit :

… chaque jour au-moins 500 personnes demande la liste de 'ROMAN' …

chacune de ces 500 personnes sera mise dans la liste des personnes associées à l'unique demande nommée ROMAM
donc, elles vont demander une copie du seul fichier contenant la liste de 'ROMAN'

Dans son message #6, environnementBash a écrit :

… au-moins 200 personnes qui demandent 'BD' …

chacune de ces 200 personnes sera mise dans la liste des personnes associées à l'unique demande nommée BD
donc, elles vont demander une copie du seul fichier contenant la liste de 'BD'

Dans son message #6, environnementBash a écrit :

… et au-moins 350 personnes qui demandent 'SCIENCES', …

chacune de ces 350 personnes sera mise dans la liste des personnes associées à l'unique demande nommée SCIENCES
donc, elles vont demander une copie du seul fichier contenant la liste de 'SCIENCES'

Finalement il n'y aura que 3 fichiers résultants des 3 demandes

et il y aura 3 listes de personnes <=> une liste de personnes pour chacune des 3 demandes
ce qui fera 1050 personnes qui recevront chacune une copie d'un de ces 3 fichiers résultants de ces 3 demandes
donc, 1050 fichiers de type lien

Merci beaucoup pour ces précieuses informations. Cela m'a permis d'éclaircir ce que je n'avais pas compris. il ne me reste plus qu'à revoir mon algo (c'était là où j'avais freiné dans ma reflexion) pour revoir mon code. smile

Dernière modification par environnementBash (Le 17/07/2022, à 21:13)

Hors ligne

#14 Le 17/07/2022, à 21:42

Watael

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

mais si des livres sont ajoutés entre le moment où la liste est créée et celui où une requête est émise, celle-ci ne fournira pas la liste exhaustive des livres d'une catégorie... sad

il faudra nous en dire plus sur le mode d'interrogation du système  : qui interroge la DB, et comment ce "qui" accède au système ?

je me pose la question de la pertinence d'écrire le résultat dans un fichier. J'enverrais plutôt le résultat à less; libre à l'utilisateur de sauvegarder la liste s'il le souhaite (touche s dans less).
c'est demandé dans l'énoncé de l'exercice ?
on peut peut-être avoir l'énoncé.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#15 Le 17/07/2022, à 22:28

environnementBash

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Je n'ai malheureusement pas eu le temps de recopier toute la consigne le jour de la consultation de la copie car j'ai du écrire à la main sur papier une consigne qui était longue... Néanmoins, j'ai écris à partir de la moitié car le début expliquait simplement les champs, le contenu de livres.txt et que l'utilisateur devra dire quelle catégorie de livre il veut que le script extrait pour lui...

voici ce que j'ai (c'est une phrase qui fait 8 lignes car je devais écrire vite...) :

D’abord, je vérifie si livres.txt existe bel et bien dans mon rep personnel car juste après ça je dois demander à l'utilisateur quelle catégorie il veut extraire pour ensuite pouvoir réaliser l'extraction des livres qui correspondent à la catégorie choisie par la personne et puis je dois compter le nb de livres extraits, et à la fin je devrai être capable de créer un fichier où :
la 1re ligne renvoie une liste des auteurs et les titres de la catégorie x
les lignes qui suivent indiquera le nom ‘’ - ‘’le titre de la catégorie x
la dernière ligne indiquera le nb de livres (y)
pour afficher à l'écran le contenu du fichier que je viens de créé

J'aimerais également rebondir au sujet de la cmd less car c'est vrai que je n'y avais pas encore pensé... :
il s'agit bien d'une alternative à cat pour pouvoir visualiser le contenu d’un long fichier car elle possède une commande de pagination ? je demande cela car je ne vois pas comment l'utilisateur pourra sauver son fichier (ce n'est pas demandé dans la consigne en tout cas j'en suis sûr)

pour répondre à cette question :

il faudra nous en dire plus sur le mode d'interrogation du système  : qui interroge la DB, et comment ce "qui" accède au système ?

il n'y avait rien qui parlait de cela dans la consigne. C'est juste un script en bash qui extrait les livres à partir d'un fichier à plat nommé livres.txt


Demain je reviendrai sur le forum et vous tiendrai au courant de mon avancée.

Dernière modification par environnementBash (Le 17/07/2022, à 22:42)

Hors ligne

#16 Le 17/07/2022, à 23:05

MicP

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Pour l'histoire des livres à retirer de la base de donnée des livres présents, il faudrait décider de quand faire appliquer la requête :
soit :
- quand la personne fait sa demande => réservation => suppression des livres réservés dans la base de données des livres puisqu'il n'y aura peut-être pas XX exemplaires du même livre
ou
- quand la personne vient effectivement retirer ses livres => suppression des livres réservés dans la base de données des livres puisqu'il n'y aura peut-être pas XX exemplaires du même livre

=======
Ça vaudrait le coup d'aller faire un tour à la BnF pour leur demander comment leur système gère ça
parce que c'est le cas de dire que dans ce domaine, ils doivent "en connaître un rayon", (et en plus, c'est super bien climatisé smile )
Mais bon, ça n'a peut-être rien à voir avec le sujet donné.

Dernière modification par MicP (Le 17/07/2022, à 23:07)

Hors ligne

#17 Le 17/07/2022, à 23:27

Watael

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

MicP a écrit :

retirer [des livres] de la base de donnée des livres présents

heu, mais il n'est pas question de ça. 8O

environnementBash a écrit :

demander à l'utilisateur quelle catégorie il veut extraire pour ensuite pouvoir réaliser l'extraction des livres qui correspondent à la catégorie choisie

je crois qu'il est seulement question de sélectionner des données du fichier pour les afficher. smile

environnementBash a écrit :

J'aimerais également rebondir au sujet de la cmd less car c'est vrai que je n'y avais pas encore pensé... :
il s'agit bien d'une alternative à cat pour pouvoir visualiser le contenu d’un long fichier car elle possède une commande de pagination ?

oui, less est un lecteur (pager).

je demande cela car je ne vois pas comment l'utilisateur pourra sauver son fichier (ce n'est pas demandé dans la consigne en tout cas j'en suis sûr)

comme je l'ai dit, dans less, utiliser la commande s.
tu peux essayer avec une page man  (qui est ouverte avec less, par défaut)
par exemple :

man less

une fois la page ouverte, tu tapes s, et, en bas, apparaîtra log file: qui demande de renseigner le nom du fichier dans lequel sera enregistrée la page.

=======

MicP a écrit :

Ça vaudrait le coup d'aller faire un tour à la BnF pour leur demander comment leur système gère ça

quand une recette te demande de mettre une pincée de sel, tu vas demander à un conducteur de pelleteuse comment elle fonctionne ? lol lol lol
wink

Dernière modification par Watael (Le 17/07/2022, à 23:28)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#18 Le 18/07/2022, à 00:01

environnementBash

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

MicP a écrit :

Pour l'histoire des livres à retirer de la base de donnée des livres présents, il faudrait décider de quand faire appliquer la requête :

quand la personne fait sa demande.

Je devrai préciser que dans la consigne, on ne parle pas de 'réservation' ni d'un 'nb d'exemplaire de livres présents' même si cela aurait été très intéressant (j'y travaillerai sur ce raisonnement quand j'aurais terminé ce script demain)
Pour cette exercice car je dois simplement extraire des lignes/livres dont la catégorie correspond à ce qui a été demandé à l'utilisateur, pour ensuite créer un fichier et mettre ces données dedans (sans utiliser awk, ce qui m'a compliqué la tache)...

MicP a écrit :

Mais bon, ça n'a peut-être rien à voir avec le sujet donné

Bien au contraire, je prends bonne note de votre commentaire car elle m'a beaucoup fait réfléchir. Je travaillerai sur ce genre de raisonnement quand je serai un peu plus à l'aise avec l'écriture de script en bash... smile
Par exemple, et ceci n'a rien à voir avec le problème que je pose dans cette discussion, je tenterai d'écrire un script pour permettre par exemple à un étudiant d'une université de recevoir un fichier PDF sur sa boite mail avoir de voir la liste des livres présents (selon la catégorie qu'il demandé dans le formulaire) dans la bibliothèque de son université afin de voir si il peut effectuer une 'reservation' et éventuellement voir le 'nb d'exemplaire' pour chaque livre correspondant à la catégorie qu'il a demandé;
Et de là,  je me poserai la même question que vous, à savoir :

il faudrait décider de quand faire appliquer la requête :
soit :
- quand la personne fait sa demande => réservation => suppression des livres réservés dans la base de données des livres puisqu'il n'y aura peut-être pas XX exemplaires du même livre
ou
- quand la personne vient effectivement retirer ses livres => suppression des livres réservés dans la base de données des livres puisqu'il n'y aura peut-être pas XX exemplaires du même livre

mais d'abord je dois terminer mon script qui a l'air d'être beaucoup plus simple..

Hors ligne

#19 Le 18/07/2022, à 00:09

environnementBash

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

environnementBash a écrit :

demander à l'utilisateur quelle catégorie il veut extraire pour ensuite pouvoir réaliser l'extraction des livres qui correspondent à la catégorie choisie

je crois qu'il est seulement question de sélectionner des données du fichier pour les afficher. smile
C'est exactement ça.

environnementBash a écrit :

J'aimerais également rebondir au sujet de la cmd less car c'est vrai que je n'y avais pas encore pensé... :
il s'agit bien d'une alternative à cat pour pouvoir visualiser le contenu d’un long fichier car elle possède une commande de pagination ?

oui, less est un lecteur (pager).

environnementBash a écrit :

je demande cela car je ne vois pas comment l'utilisateur pourra sauver son fichier (ce n'est pas demandé dans la consigne en tout cas j'en suis sûr)

comme je l'ai dit, dans less, utiliser la commande s.
tu peux essayer avec une page man  (qui est ouverte avec less, par défaut)
par exemple :

man less

une fois la page ouverte, tu tapes s, et, en bas, apparaîtra log file: qui demande de renseigner le nom du fichier dans lequel sera enregistrée la page.

Merci beaucoup  smile

Hors ligne

#20 Le 18/07/2022, à 00:13

MicP

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Oui, il faut surtout ne pas se laisser distraire, car on a vite fait de sortir du "cahier des charges" en s'imposant des contraintes absolument inutiles et très chronophages,
sans compter qu'au final, le travail fait ne correspondrait pas du tout à ce qui avait été demandé, ce qui donnerait un script inefficace et hors sujet.

Il faut penser à régulièrement aller relire le sujet quand une étape est franchie afin de ne pas risquer de se disperser
enfin … c'est ce que moi je dois faire pour ne pas me disperser, peut-être que d'autres n'ont pas ce défaut.

Dernière modification par MicP (Le 18/07/2022, à 00:14)

Hors ligne

#21 Le 18/07/2022, à 08:03

jplemoine

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

MicP a écrit :

Il faut penser à régulièrement aller relire le sujet quand une étape est franchie afin de ne pas risquer de se disperser
enfin … c'est ce que moi je dois faire pour ne pas me disperser, peut-être que d'autres n'ont pas ce défaut.

C'est souvent le problème quand les spécifications (ie la consigne de l'exercice)  sont trop floues.
Il faut bien définir ce que l'on doit faire mais aussi ce que l'on ne doit pas faire (dans le cas d'un lotissement par exemple).

Et surtout il faut faire une analyse avant de se lancer dans le développement.

Dans le cas précis, on a une "pseudo base de données" (sous le forme d'un fichier d'entrée)
- On devra extraire xxxxx au moment de la demande
- On ne gérera pas la disponibilité de l'ouvrage (pas de gestion de stock)


Membre de l'ALDIL (Association Lyonnaise pour le Développement de l'Informatique Libre)
- En pro, après 20 ans de développement, administrateur Linux / Unix depuis Avril 2019.
- En privé, sous Ubuntu-Xubuntu depuis 2009.

Hors ligne

#22 Le 18/07/2022, à 19:06

LeoMajor

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

salut,
..donc pas de awk, ni de sqlite3, ...

cat livres.csv

auteur:titre:année:catégorie
Hergé:Le Temple du Soleil:1949:BD
Enid Mary Blyton:Oui-Oui et Madame Ouistiti:1992:ENFANTS
Hubert Reeves:Poussières d'étoiles:1984:ROMANS
Hergé:Tintin au Tibet:1960:BD

je te conseille d'ajouter un index, ou une reférence genre uuidgen.
A remarquer, que les auteurs pourraient être sur une autre table.

printf  '%d\n' "':"
58

facile avec libreoffice

unoconv -f ods --stdout -i FilterOptions=58,34,76,1,,1036,true,true livres.csv > livres.ods

guillemets facultatifs ( 34   "Hergé":"Le Temple du Soleil":"1949":"BD"  )
attention, pas de ligne vide à la fin du fichier csv

pour trier, tu sélectionnes ta plage de données incluant aussi "auteur,..., catégorie", puis Libreoffice  "/Données/trier"

Hors ligne

#23 Le 19/07/2022, à 11:12

MicP

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

Bonjour

LeoMajor a écrit :

… je te conseille d'ajouter un index, ou une reférence genre uuidgen.  …

Tant qu'à ajouter un index, autant utiliser l'ISBN 13

Recherchez, par exemple :

ISBN 13 : 9782203001138
ou/et
ISBN 13 : 9782203017146
ou/et
ISBN 13 : 9782203006461

=======
Mais je pense qu'on (je fais aussi partie de ce on) s'éloigne un peu du cadre du sujet :

Dans son message #9, environnementBash a écrit :

… Le script dont il est question dans cette discussion est seulement un exercice que je ne suis pas parvenu à réaliser. …

Dernière modification par MicP (Le 22/07/2022, à 12:56)

Hors ligne

#24 Le 21/07/2022, à 21:20

LeoMajor

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

pour s'amuser en vba/gambas3

cat  /home/toto/livres.csv

id:auteur:titre:annee:categorie
3:Hergé:Tintin au Tibet:1960:BD
2:Enid Mary Blyton:Oui-Oui et la Carte au trésor:1999:ENFANTS
4:Hergé:Le Temple du Soleil:1949:BD
0:Enid Mary Blyton:Oui-Oui et Madame Ouistiti:1992:ENFANTS
1:Hubert Reeves:Poussières d'étoiles:1984:ROMANS
5:Enid Mary Blyton:Oui-Oui et la Poudre magique:1994:ENFANTS

cat  csv.gbs

use "gb.util"

Public Sub Main()
SortCsv(User.Home &/ "livres.csv", "categorie", "annee")
SortCsv(User.Home &/ "livres.csv", "auteur", "titre")
End

Public Sub SortCsv(FileCsv As String, Key1 As String, Optional Key2 As String, Optional Key3 As String)
'Key1,Key2,Key3, Tri string.  pas de float, integer
Dim table As New Collection[], g As Collection
Dim SortKey As New String[], iSortKey As New Integer[]
Dim c As CsvFile
c = CsvFile.Open(FileCsv, ":")
While Not c.Eof
  table.Add(c.Read())
Wend
Print "fields:", c.Fields.Join(",")
Print "count:", table.count
print "sortBy", Key1, Key2, Key3

For i As Integer = 0 To table.max
  g = table[i]
  SortKey.Add(g[Key1] & g[Key2] & g[Key3] & Chr(26) & CStr(i))
Next
SortKey = SortKey.Sort()
For i As Integer = 0 To SortKey.Max
  iSortKey.Add(CInt(Split(SortKey[i], Chr$(26))[1]))
Next

Dim Ntable As New Collection[]
For i As Integer = 0 To iSortKey.max
  g = table[iSortKey[i]]
  'For Each item As Variant In g
  '  Print g.key, ":", item
  'Next
Ntable.Add(table[iSortKey[i]])
Next

Print "\ncheck\n"
For i As Integer = 0 To Ntable.max
    For Each item As Variant In Ntable[i]
      Print Ntable[i].key, item
    Next
    Print
Next
End
gbs3   csv.gbs

retourne

~/scripts$ gbs3 csv.gbs
fields:	id,auteur,titre,annee,categorie
count:	6
sortBy	categorie	annee	

check

id	4
auteur	Hergé
titre	Le Temple du Soleil
annee	1949
categorie	BD

id	3
auteur	Hergé
titre	Tintin au Tibet
annee	1960
categorie	BD

id	0
auteur	Enid Mary Blyton
titre	Oui-Oui et Madame Ouistiti
annee	1992
categorie	ENFANTS

id	5
auteur	Enid Mary Blyton
titre	Oui-Oui et la Poudre magique
annee	1994
categorie	ENFANTS

id	2
auteur	Enid Mary Blyton
titre	Oui-Oui et la Carte au trésor
annee	1999
categorie	ENFANTS

id	1
auteur	Hubert Reeves
titre	Poussières d'étoiles
annee	1984
categorie	ROMANS

fields:	id,auteur,titre,annee,categorie
count:	6
sortBy	auteur	titre	

check

id	0
auteur	Enid Mary Blyton
titre	Oui-Oui et Madame Ouistiti
annee	1992
categorie	ENFANTS

id	2
auteur	Enid Mary Blyton
titre	Oui-Oui et la Carte au trésor
annee	1999
categorie	ENFANTS

id	5
auteur	Enid Mary Blyton
titre	Oui-Oui et la Poudre magique
annee	1994
categorie	ENFANTS

id	4
auteur	Hergé
titre	Le Temple du Soleil
annee	1949
categorie	BD

id	3
auteur	Hergé
titre	Tintin au Tibet
annee	1960
categorie	BD

id	1
auteur	Hubert Reeves
titre	Poussières d'étoiles
annee	1984
categorie	ROMANS

Hors ligne

#25 Le 21/07/2022, à 21:26

Watael

Re : en BASH : extraire des lignes d'une catégorie souhaitée (sans awk)

environnementBash n'a déjà pas le droit d'utiliser awk...
en plus, il est interminable ce script gambas ! hmm
wink

en bash, ça ne doit pas prendre plus d'une vingtaine de lignes.


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne