Manipuler le contenue d'un fichier

Résolu
braza -  
 braza -
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

4 réponses

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    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
  2. braza
     
    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
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
    1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
       
      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
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      y a-t-il une raison de ne pas utiliser sed -r pour éviter les \( et \{ ?
      0
      1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
         
        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
      2. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        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
      3. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501 > zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention  
         
        La syntaxe allégée ;-))
        sed -r 's/(-[0-9]{2})([0-9]{2}:[0-9]{2})\+[^|]*/\1 \2/;s/|$//'
        0
  4. braza
     
    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
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      essayer
      $ awk 'BEGIN {FS=OFS="|"} {sub("[|]*$", ""); print gensub("(-[0-9]{2})([0-9]{2})(:[0-9]{2})[^|]*", "\\1 \\2\\3", 1)}' fichier
      0
    2. UnGnU Messages postés 1468 Statut Contributeur 158
       
      Voir aussi :

      sed -r 's/(-[0-9]{2})([0-9]{2}:[0-9]{2})\+[^|]*/\1 \2/;s/\|\|*$//' fichier
      0
    3. braza > dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention  
       
      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
    4. braza > UnGnU Messages postés 1468 Statut Contributeur
       
      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 et je vous demande de me excuse a ce derengement
      0
    5. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660 > braza
       
      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