Manipuler le contenue d'un fichier

Résolu/Fermé
braza - Modifié par braza le 22/05/2016 à 00:10
 braza - 24 mai 2016 à 14:00
Bonjour,

j’ai un fichier qui contient des donne organiser comme suit

2016-04-21|20:01|216|No|BUG|4|1| 85|2016-04-2120:01+00:00|8
2016-04-21|20:01|218|No|BUG|1|0|0|2016-04-2120:01+00:00|3|
2016-04-22|20:02|220|No|BUG|4|3|0|2016-04-2122:01+00:00|10
2016-04-22|20:02|222|No|BUG|4|4|0|2016-04-2120:01+00:00|10|
2016-04-23|20:03|224|No|BUG|10|3|0|2016-04-2120:01+00:00|14
2016-04-21|20:01|217|No|BUG|6|3|0|2016-04-2120:01+00:00|11
2016-04-21|20:01|219|No|BUG|6|3|0|2016-04-2120:01+00:00|11|

et je veux enlever le dernier pipe et insert un espace entre la date et le temps pour qu'il soit comme suit :
2016-04-21|20:01|216|No|BUG|4|1| 85|2016-04-21 20:01|8
2016-04-21|20:01|218|No|BUG|1|0|0|2016-04-21 20:01|3
2016-04-22|20:02|220|No|BUG|4|3|0|2016-04-21 22:01|10
2016-04-22|20:02|222|No|BUG|4|4|0|2016-04-21 20:01|10
2016-04-23|20:03|224|No|BUG|10|3|0|2016-04-21 20:01|14
2016-04-21|20:01|217|No|BUG|6|3|0|2016-04-21 20:01|11
2016-04-21|20:01|219|No|BUG|6|3|0|2016-04-21 20:01|11

je souhaiterais connaître la commande qui me permettre de faire ce ci



Merci



A voir également:

4 réponses

zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 557
Modifié par zipe31 le 22/05/2016 à 08:35
Salut,

$ cat plop 
2016-04-21|20:01|216|No|BUG|4|1| 85|2016-04-2120:01+00:00|8
2016-04-21|20:01|218|No|BUG|1|0|0|2016-04-2120:01+00:00|3|
2016-04-22|20:02|220|No|BUG|4|3|0|2016-04-2122:01+00:00|10
2016-04-22|20:02|222|No|BUG|4|4|0|2016-04-2120:01+00:00|10|
2016-04-23|20:03|224|No|BUG|10|3|0|2016-04-2120:01+00:00|14
2016-04-21|20:01|217|No|BUG|6|3|0|2016-04-2120:01+00:00|11
2016-04-21|20:01|219|No|BUG|6|3|0|2016-04-2120:01+00:00|11|

$ sed 's/\(-[[:digit:]]\{2\}\)\([[:digit:]]\{2\}\)/\1 \2/;s/|$//' plop
2016-04-21|20:01|216|No|BUG|4|1| 85|2016-04-21 20:01+00:00|8
2016-04-21|20:01|218|No|BUG|1|0|0|2016-04-21 20:01+00:00|3
2016-04-22|20:02|220|No|BUG|4|3|0|2016-04-21 22:01+00:00|10
2016-04-22|20:02|222|No|BUG|4|4|0|2016-04-21 20:01+00:00|10
2016-04-23|20:03|224|No|BUG|10|3|0|2016-04-21 20:01+00:00|14
2016-04-21|20:01|217|No|BUG|6|3|0|2016-04-21 20:01+00:00|11
2016-04-21|20:01|219|No|BUG|6|3|0|2016-04-21 20:01+00:00|11


Le dernier pipe est supprimé par la commande
s/|$//
, le $ après le pipe désignant la fin de ligne.

_______________________________ ☯ Zen my nuggets ☮ ______________________________
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot… 🐧
1
Pour la suppression de dernier caractère pipe j'au utilise la commande
sed -e "s/|//g10" fichier_source > fichier_cible et ça marche
mais le nombre des caractères varie et cette comande remplace le pipe par espace appart ire de 10 ieme colon y a t il une manière d'utilise le séparateur pipe pour généralisé l’opération ?
0
dubcek Messages postés 18579 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 25 janvier 2023 5 582
Modifié par dubcek le 22/05/2016 à 12:35
hello
$ awk  'BEGIN {FS=OFS="|"} /[|]$/ {NF--}  {$0=gensub("(-[0-9]{2})([0-9]{2})(:[0-9]{2})[^|]*", "\\1 \\2\\3", 1); print }' fichier
2016-04-21|20:01|216|No|BUG|4|1| 85|2016-04-21 20:01|8
2016-04-21|20:01|218|No|BUG|1|0|0|2016-04-21 20:01|3
2016-04-22|20:02|220|No|BUG|4|3|0|2016-04-21 22:01|10
2016-04-22|20:02|222|No|BUG|4|4|0|2016-04-21 20:01|10
2016-04-23|20:03|224|No|BUG|10|3|0|2016-04-21 20:01|14
2016-04-21|20:01|217|No|BUG|6|3|0|2016-04-21 20:01|11
2016-04-21|20:01|219|No|BUG|6|3|0|2016-04-21 20:01|11
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 557
22 mai 2016 à 13:21
Salut dubcek,

Oups, je n'avais pas vu qu'il fallait aussi virer les +00:00 ;-\

sed 's/\(-[0-9]\{2\}\)\([0-9]\{2\}:[0-9]\{2\}\)+[^|]*/\1 \2/;s/|$//' fichier
0
dubcek Messages postés 18579 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 25 janvier 2023 5 582
22 mai 2016 à 13:44
y a-t-il une raison de ne pas utiliser sed -r pour éviter les \( et \{ ?
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 557 > dubcek Messages postés 18579 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 25 janvier 2023
22 mai 2016 à 13:53
Pas spécialement, mais en retour il faudra protéger les crochets et autres caractères que je n'ai plus en tête ;-\
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 557 > zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
22 mai 2016 à 14:00
Laisse tomber, j'ai dit une connerie, il n'y a aucune raison de ne pas utiliser "-r", c'est juste que je n'y suis pas habitué ;-\

Les crochets n'ont pas besoin d'être protégés comme je l'ai dit… je suis un âne bâté ;-)
0
zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 557 > zipe31 Messages postés 36317 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021
22 mai 2016 à 14:09
La syntaxe allégée ;-))
sed -r 's/(-[0-9]{2})([0-9]{2}:[0-9]{2})\+[^|]*/\1 \2/;s/|$//'
0
Merci pour tout vos réponses et dans le cas ou le pipe se répété par exemple :
2016-04-21|20:01|216|No|BUG|4|1| 85|2016-04-21 20:01|8||
2016-04-21|20:01|218|No|BUG|1|0|0|2016-04-21 20:01|3|
2016-04-22|20:02|220|No|BUG|4|3|0|2016-04-21 22:01|10||
2016-04-22|20:02|222|No|BUG|4|4|0|2016-04-21 20:01|10|
2016-04-23|20:03|224|No|BUG|10|3|0|2016-04-21 20:01|14||
2016-04-21|20:01|217|No|BUG|6|3|0|2016-04-21 20:01|11|
2016-04-21|20:01|219|No|BUG|6|3|0|2016-04-21 20:01|11||
0
dubcek Messages postés 18579 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 25 janvier 2023 5 582
23 mai 2016 à 12:41
essayer
$ awk 'BEGIN {FS=OFS="|"} {sub("[|]*$", ""); print gensub("(-[0-9]{2})([0-9]{2})(:[0-9]{2})[^|]*", "\\1 \\2\\3", 1)}' fichier
0
braza > dubcek Messages postés 18579 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 25 janvier 2023
Modifié par braza le 23/05/2016 à 13:01
Merci c très gentil de vos part mais juste svp un petit commentaire su la commande pcq j'ai pas bien compris comment elle fonctions exactement
0
dubcek Messages postés 18579 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 25 janvier 2023 5 582 > braza
23 mai 2016 à 13:17
sub("[|]*$", "") on supprime tout les | en fin de ligne
gensub("(-[0-9]{2})([0-9]{2}) on groupe - 2 chiffres puis 2 chiffres dans 1 et 2
(:[0-9]{2}) on groupe : 2 chiffres dans 3
[^|]* tout ce qui suit jusqu'à | n'est pas mis dans un groupe, pas de (), donc sera éliminé
"\\1 \\2\\3" on remet les groupes, avec un espace entre 1 et 2
0
braza > dubcek Messages postés 18579 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 25 janvier 2023
24 mai 2016 à 14:00
Merci Merci j'ai compris
0
UnGnU Messages postés 1156 Date d'inscription lundi 2 mai 2016 Statut Contributeur Dernière intervention 22 décembre 2020 153
23 mai 2016 à 12:47
Voir aussi :

sed -r 's/(-[0-9]{2})([0-9]{2}:[0-9]{2})\+[^|]*/\1 \2/;s/\|\|*$//' fichier
0