Modification de flux avec calcul
Résolu
Char Snipeur
Messages postés
9813
Date d'inscription
Statut
Contributeur
Dernière intervention
-
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
dubcek Messages postés 18789 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
voila, j'ai un flux de texte (produit avec un outils genre cat, cuebreakpoints pour être précis) qui me sort du texte sous la forme :
[m]m:ss:ff
que je voudrais transformer avec une commande comme sed ou awk en
[m]m:ss:nnn
avec la relation nnn=(ff/75)*1000.
Je vois différentes solutions en script shell, mais pas sur un flux.
voila, j'ai un flux de texte (produit avec un outils genre cat, cuebreakpoints pour être précis) qui me sort du texte sous la forme :
[m]m:ss:ff
que je voudrais transformer avec une commande comme sed ou awk en
[m]m:ss:nnn
avec la relation nnn=(ff/75)*1000.
Je vois différentes solutions en script shell, mais pas sur un flux.
A voir également:
- Modification de flux avec calcul
- Suivi de modification word - Guide
- Calcul moyenne excel - Guide
- Logiciel gratuit modification pdf - Guide
- Calcul km marche à pied gratuit - Télécharger - Sport
- Modification dns - Guide
4 réponses
hello
me voilou
avec un flux à la place du echo, awk traitera chaque ligne qui arrive
me voilou
avec un flux à la place du echo, awk traitera chaque ligne qui arrive
$ echo 3:12.0 | awk -F "[:.]" '{print $1 ":" $2 "." sprintf("%03d", $3*1000/75)}'
3:12.000
Salut,
En espérant avoir tout compris de ton problème...
Ce fichier :
Lu ligne par ligne depuis le
C'est ça que tu veux ?
En espérant avoir tout compris de ton problème...
Ce fichier :
$ cat plop
1:22:120
23:45:565
54:10:963
Lu ligne par ligne depuis le
shellavec une temporisation de 3 secondes, pipé via
awkme sort :
$ while read line;do echo ${line};sleep 3;done < plop | awk 'BEGIN{FS=OFS=":"} {var=($3/75)*1000 } gsub($3, var,$3) { print }'
1:22:1600
23:45:7533.33
54:10:12840
C'est ça que tu veux ?
Salut, merci zipe, c'est presque ça. Le premier fichier se fini par 2 caractère (entre 0 et 74) et je doit ressortir un entier sur 3 caractère.
La bonne opération entière n'est pas celle que j'ai donnée, mais ff*1000/75.
Par contre, erreur de ma part, c'est [m]m:ss.ff le format
Je vois grosso modo comment modifier awk, sauf pour lui demander de respecter les 3 caractères pour l'affichage.
Par exemple, il faut transformer 3:12.00 en 3:12.000.
Question général : On est obligé de passer par le while, awk ne fonctionne pas en flux comme sed ?
La bonne opération entière n'est pas celle que j'ai donnée, mais ff*1000/75.
Par contre, erreur de ma part, c'est [m]m:ss.ff le format
Je vois grosso modo comment modifier awk, sauf pour lui demander de respecter les 3 caractères pour l'affichage.
Par exemple, il faut transformer 3:12.00 en 3:12.000.
Question général : On est obligé de passer par le while, awk ne fonctionne pas en flux comme sed ?
Je vois grosso modo comment modifier awk, sauf pour lui demander de respecter les 3 caractères pour l'affichage.Euh... là on va attendre dubcek, le spécialiste awk par excellence. Ma connaissance de awk est trop sommaire pour ça, désolé ;-(
Question général : On est obligé de passer par le while, awk ne fonctionne pas en flux comme sed ?J'ai utilisé une boucle
whilejuste pour simuler un flux continu. Pas de souci pour un emploi normal ;-))
En effet, pas besoin du while.
J'ai trouver par hasard la fonction permettant de faire ce que je voulais. Au final la commande awk donne :
Encore merci zipe.
Par contre, ça ne résoud pas mon problème de split. Mais ceci est un autre sujet.
J'ai trouver par hasard la fonction permettant de faire ce que je voulais. Au final la commande awk donne :
awk 'BEGIN{FS=OFS="."} {var=$2*1000/75 } gsub($2, sprintf("%.3d",var),$3) { print }'
Encore merci zipe.
Par contre, ça ne résoud pas mon problème de split. Mais ceci est un autre sujet.
Une solution qui me convient, bien que plus obscure que celle de zipe Pour un néophite de awk comme moi.
Il définit 2 séparateurs de champs différents (deux points et point). Ce qui nous donne 3 champs pour chaque ligne.
Il imprime les 2 premiers champs tels qu'ils sont, en remettant le séparateur deux points entre les deux et le point en fin.
Puis il imprime le dernier champs en le mettant en forme directement grâce à la directive sprintf.
Comme dubcek connaît parfaitement toutes les subtilités de à l'inverse de bibi, c'est quand même beaucoup plus concis et précis ;-))
j'ajouterais que %03d affiche toujours 3 chiffres avec des 0 devant si < 100