Bonjour,
Le titre n'est peut-être pas très équivoque mais je vais essayer de vous expliquer au mieux mon problème.
J'ai un script qui récupère les valeurs de plusieurs fichiers et qui les ajoute les une à la suite des autres. Afin de conserver l'origine de la valeur, je rajoute en commentaire le nom du fichier source.
Ce qui me donne quelque chose comme ça :
$ cat test.txt
toto #TEST1
tata #TEST1
titi #TEST1
toto #TEST2
titi #TEST2
titi #TEST3
Afin d'exploiter au mieux ce fichier, j'ai besoin de supprimer les doublons. Cependant je souhaiterais conserver les commentaires et les concaténer. Le but est d'avoir à la fin un fichier qui ressemble à ça :
$ cat test.txt
toto #TEST1,TEST2
tata #TEST1
titi #TEST1,TEST2,TEST3
Voila je fais appel à vous car je ne trouve pas le moyen de faire ça… :(
Si quelqu'un à une idée ?
Merci !
# XY Problem ?
Posté par foobarbazz . Évalué à 3.
Ça me fait penser à un XY problem parce que quand on a besoin de savoir d'où vienne les choses, il est raisonnable de ne pas commencer par les mélanger…
C'est quoi le problème ? ^
http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem
# 1 les classer, 2 les commenter
Posté par NeoX . Évalué à 4.
1°) les classer
sort -nk1 fichier_source
ca va te donner un truc comme ca
titi #test1
titi #test2
titi #test3
toto #test2
toto #test4
2°) lire ces nouvelles données, ligne par ligne,
et si le premier champs est le meme que la ligne precedente, alors concatener le champs commentaire courant avec celui de la ligne precedente,
sinon demarrer un nouveau commentaire
en shell ce pourrait etre
en veillant à la protection des variables, on doit arriver à ce que tu veux
[^] # Re: 1 les classer, 2 les commenter
Posté par Michaël (site web personnel) . Évalué à 2. Dernière modification le 14 février 2017 à 14:57.
Quelques remarques:
[[ "${valeur}" == "${ancienvaleur}" ]]
Et puis quitte à utiliser des mots français, autant accorder l'adjectif, non? :)
printf '%s,%s\n' "${ancienvaleur}" "${anciencommentaire}"
Ton programme a un petit problème d'IFS, il lit le
#
dans anciencommentaire.Il crée une ligne supplémentaire
,
au tout début!En traduisant le code en sh cela devient donc
(Il y a un petit problème de mathjax dans le bloc de code avec tripe contr'apostrophe, désolé pour le formatage.)
[^] # Re: 1 les classer, 2 les commenter
Posté par NeoX . Évalué à 2.
c'est parce qu'il faut preciser le langage apres les ```
dans l'exemple en dessous (dans la FAQ tout en bas) ```python
et pour une ligne simple, le ` simple est suffisant
une ligne de code simple
[^] # Re: 1 les classer, 2 les commenter
Posté par guppy . Évalué à 0.
Les accolades sont inutiles dans ce cas, ceci est suffisant :
[^] # Re: 1 les classer, 2 les commenter
Posté par Michaël (site web personnel) . Évalué à 3.
C'est exact, cependant lorsqu'on programme beaucoup en shell, on utilise souvent les modificateurs
:?
,:-
,:+
etc. qui eux nécessitent les accolades, on prend alors l'habitude d'utiliser systématiquement les accolades.# Éviter de faire des traitements en shell
Posté par Michaël (site web personnel) . Évalué à 3.
Mon point de vue est que le shell est très bien pour combiner des traitements ensemble mais qu'il est plutôt à éviter pour implémenter ces traitements eux-mêmes. Les raisons sont que le langage rend la description de ces traitements difficile – même si certains dialectes comme bash ou zsh améliorent un peu la situation. Voici donc une procédure awk qui fait le travail, mais beaucoup d'autres langages peuvent être utilisés à sa place:
Le cœur du programme est la partie
qui est appliquée sur toutes les lignes de l'entrée. Les variables
$1
et$2
renvoient à la première et deuxième colonne de la ligne en cours de traitement, la déclarationBEGIN { FS=" #" }
dit justement comment ces colonnes sont délimitées. La phraseseen[$1]
est peut être un peu bizarre, elle correspond à l'ajout d'une clef sans valeur dans un tableau associatif.Lorsque toutes les lignes ont été traitées, awk* passe au bloc
END
dont le contenu est lui aussi explicite.[^] # Re: Éviter de faire des traitements en shell
Posté par Le Pnume . Évalué à 4.
Juste pour le fun, j'avais besoin de me changer les idées.
En R avec le package dplyr, le script admet 2 paramètres, un nom de fichier d'entrée et un nom de fichier de sortie :
Je sors
[^] # Re: Éviter de faire des traitements en shell
Posté par Michaël (site web personnel) . Évalué à 2.
Mais non, mais non, c'est sympa. Quelqu'un le fait en APL?
# presque
Posté par Francky04 . Évalué à 1.
Salut NeoX et merci !
J'ai un peu adapté ton script et c'est presque bon :
Voici le résultat :
tata #TEST1
titi #TEST1
titi #TEST1,#TEST2
titi #TEST1,#TEST2,#TEST3
toto #TEST1
toto #TEST1,#TEST2
Reste maintenant à supprimer les lignes 2,3 et 4.
[^] # Re: presque
Posté par guppy . Évalué à 1.
Une autre solution si tu utilises bash :
Ca donne ça :
# Bonjour
Posté par Marotte ⛧ . Évalué à 5.
Je pense que tu voulais dire que ton titre est équivoque au contraire.
http://www.larousse.fr/dictionnaires/francais/%C3%A9quivoque/30718
Le contraire de « équivoque » est, si je ne m’abuse, « univoque ».
# Perl ? (:
Posté par Luvwahraan . Évalué à 2. Dernière modification le 16 février 2017 à 17:37.
Un petit passage dans un hash (dont les clés sont uniques) permet d’éliminer des doublons.
Le reste n’est que de la mise en forme.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.