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 15/06/2015, à 13:36

fbj

[Résolu] sed : appliquer un calcul à une référence arrière

Bonjour à tous,

Est-ce que quelqu'un sait s'il est possible de faire des calculs sur des références arrières dans une substitution sed, si les références arrières sont toujours des entiers ?
L'idée serait de pouvoir rechercher des motifs numériques avec séparateurs (suite de 4 nombres séparés pas des ":") à l'intérieur de fichiers textes, avec de nombreuses occurrences à l'intérieur du fichier, puis d'appliquer un calcul numérique sur chacune de ses occurrences et enfin substituer le résultat.
sed me paraissait une bonne option, puisqu'il s'agit de parcourir et remplacer des données ligne par ligne à la volée dans des fichiers, mais je n'ai pas l'impression qu'il permette de faire du calcul sur des références arrières, malheureusement ?

Cordialement,

fbj

Dernière modification par fbj (Le 16/06/2015, à 11:18)

Hors ligne

#2 Le 15/06/2015, à 14:24

tiramiseb

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Salut,

Peut-être pourrais-tu aller "un peu plus loin" avec awk plutôt que sed... Mais pour ma part je ne fais que des usages simples de ces deux applications, je ne serais pas le meilleur conseiller qu'il soit smile

Hors ligne

#3 Le 15/06/2015, à 14:30

fbj

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Merci pour ta réponse.

J'ai l'impression, peut-être fausse, que awk ne pourrait pas faire les calculs sur les nombres en laissant le reste inchangé ? Car tout le reste du fichier texte ne doit pas bouger.

Hors ligne

#4 Le 15/06/2015, à 17:04

pingouinux

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Bonjour,
Le mieux serait peut-être de donner un petit exemple.

Hors ligne

#5 Le 15/06/2015, à 18:00

fbj

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Le fichier à traiter ressemble à ça :

987
dutexte

11:22:33:44
55:66:77:88

du texte encore
et toujours du texte
12345

00:22:44:66
11:33:55:77
du texte ici aussi

2468
etc...

Il faut pouvoir accéder aux différents groupes de nombres séparés par deux points pour appliquer un calcul sur ces nombres, et mettre le résultat à leur place, sans toucher au reste du fichier. On ne connait pas à l'avance le nombre d'occurrences du pattern de 4 nombres dans le fichier.

Mais j'ai l'impression qu'un éditeur de flux comme sed ou d'autres méthodes de substitution à base de awk ou perl arrivent à leurs limites... Et qu'il faudrait beaucoup plus de code pour y arriver. (extraire les nombres, les mettre dans un tableau, appliquer le calcul au tableau, réinjecter les résultats dans le fichier ?)

Hors ligne

#6 Le 15/06/2015, à 18:08

pingouinux

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Peux-tu montrer aussi, sur cet exemple, le fichier que tu veux obtenir ?

Ajouté :
Par exemple, si tu veux remplacer la ligne contenant les 4 nombres par leur produit

awk -F ":" '{if(NF==4){print $1*$2*$3*$4}else{print}}' fichier

Dernière modification par pingouinux (Le 15/06/2015, à 18:23)

Hors ligne

#7 Le 15/06/2015, à 18:29

fbj

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Cela dépend des cas (plusieurs types de fichiers à traiter), je voudrais de manière générale pouvoir faire un calcul sur les nombres. Ce sont toujours des opérations sur des entiers et dont le résultat sera un entier, avec des produits, division, sommes et modulos.

Par exemple, à partir du fichier ci-dessus, pour chaque groupe de nombre, multiplier le premier terme par 20, le deuxième par 10, laisser le 3ème tel que, prendre le modulo 2 du quatrième, additionner le tout et rajouter 3 au total.

Ce qui donnerait dans ce cas :

987
dutexte

476
1840

du texte encore
et toujours du texte
12345

267
609
du texte ici aussi

2468
etc...

Hors ligne

#8 Le 15/06/2015, à 18:34

fbj

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Mais ce que je suis surtout en train de me dire, c'est que j'aime bien bricoler des fichiers avec un bout de script quand ce n'est pas trop compliqué, mais qu'à un certain niveau, c'est un métier, et je me demandais s'il existait des scripteurs/programmeurs rompus à ce genre de choses qui proposaient leurs services de manière ponctuelle ? (et à même de facturer, auto-entrepreneur ou autre).

Hors ligne

#9 Le 15/06/2015, à 18:47

pingouinux

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Pour ce que tu demandes en #7

awk -F ":" '{if(NF==4){print 20*$1 + 10*$2 + $3 + $4%2 + 3}else{print}}' fichier

Hors ligne

#10 Le 15/06/2015, à 19:12

fbj

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Merci beaucoup, je teste ça demain matin.

Et pour ce je demande en #8 ? big_smile

Hors ligne

#11 Le 15/06/2015, à 19:22

tiramiseb

Re : [Résolu] sed : appliquer un calcul à une référence arrière

je me demandais s'il existait des scripteurs/programmeurs rompus à ce genre de choses qui proposaient leurs services de manière ponctuelle ? (et à même de facturer, auto-entrepreneur ou autre).

Ouais, moi par exemple smile

Mais y'a aussi des gars comme pingouinux qui aide volontiers ici, il est très actif sur ce genre de problématiques (de mon côté, vu que c'est une partie de mon gagne-pain, je limite certaines de mes interventions...)

Pour des questions occasionnelles comme ça, c'est très bien (surtout quand tu es aidé par pingouinux).

Après, si tu as besoin de nouveaux scripts régulièrement, c'est sûr que profiter du forum au bout d'un moment c'est abusé, quoi...

Dernière modification par tiramiseb (Le 15/06/2015, à 19:23)

Hors ligne

#12 Le 16/06/2015, à 11:17

fbj

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Bon et bien le code proposé par pingouinux fonctionne parfaitement, je passe le sujet en [résolu].

Je ne maîtrise pas awk et sa syntaxe, je constate que l'outil est très puissant.

Hors ligne

#13 Le 16/06/2015, à 11:21

Rufus T. Firefly

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Salut,

Un peu de lecture ?
La bible du bash
Vers la fin, il y a un petit guide sur sed et sur awk...


La provocation est une façon de remettre la réalité sur ses pieds. (Bertolt Brecht)
Il n'y a pas de route royale pour la science et ceux-là seulement ont chance d'arriver à ses sommets lumineux qui ne craignent pas de se fatiguer à gravir ses sentiers escarpés. (Karl Marx)
Il est devenu plus facile de penser la fin du monde que la fin du capitalisme

Hors ligne

#14 Le 28/11/2015, à 19:12

fbj

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Bonjour à tous,

Un petit up pour vous dire que j'ai depuis acheté le "sed & awk" de Dougherty et Robbins l'été dernier, et que j'ai depuis réussi à faire beaucoup de choses dont je ne me pensais même pas capable ! J'en ai aussi profité pour réviser un peu les expressions régulières.

Merci encore à tous.

Dernière modification par fbj (Le 28/11/2015, à 19:13)

Hors ligne

#15 Le 28/11/2015, à 20:36

MicP

Re : [Résolu] sed : appliquer un calcul à une référence arrière

Avec seulement bash :

while read i; do 
  [[ "$i" =~ ([0-9]{2}):([0-9]{2}):([0-9]{2}):([0-9]{2}) ]]
  [[ ${BASH_REMATCH[@]} ]] \
    && echo $(( (${BASH_REMATCH[1]} * 20) + (${BASH_REMATCH[2]} * 10) + ${BASH_REMATCH[3]} + (${BASH_REMATCH[4]} % 2) + 3 )) \
    || echo $i
done < fichEntree.txt

Dernière modification par MicP (Le 03/12/2015, à 13:12)

Hors ligne