Forum Programmation.shell Comment afficher ligne apres ligne ?

Posté par  .
Étiquettes : aucune
0
14
nov.
2005
Bonjour a tous,

Comment faire pour afficher ligne après ligne a partir d'une ligne précise et ajouter a la fin de chaque ligne " [ OK ] ?

J'ai pensé a ça :

fic=`cat file_date.txt |grep "1080439200"`
for text in $fic
do
$text; echo " [OK]"
do

Mais ça ne fonctionne pas !!

Mon fichier ressemble a ça:

|Changement hiver/ete 2003 | 1048989600|
|Changement ete/hiver 2003 | 1067137200|
|Changement hiver/ete 2004 | 1080439200|
|Changement ete/hiver 2004 | 1099191600|
|Changement hiver/ete 2005 | 1111888800|
|Changement ete/hiver 2005 | 1130641200|
|Changement hiver/ete 2006 | 1143338400|
|Changement ete/hiver 2006 | 1162090800|

Merci pour toutes réponses.
  • # avec awk

    Posté par  (site web personnel) . Évalué à 2.

    A priori, je ferais ça avec awk.
    Tu veux seulement les lignes a partir de 1080439200, et ajouter OK a la fin ?
    Un truc du genre

    awk 'BEGIN {flag=0}; /1080439200/ {flag=1;} flag==1 {print $0 "[OK]"}' file_date.txt

    petite explication : on met flag a 1 dés qu'on rencontre la chaine 10... et si flag vaut 1, on ecrit le contenu de la ligne plus [OK].
    • [^] # Re: avec awk

      Posté par  . Évalué à 1.

      Merci beaucoup,ça fonctionne.

      Par contre comment faire pour qu'il s'arrête a "1172050800" ???

      en faite, je souhaite avoir ce résultat:

      |Changement hiver/ete 2003 |......................0|
      |Changement ete/hiver 2003 |......................0|
      |Changement hiver/ete 2004 | 1080439200| [ OK ]
      |Changement ete/hiver 2004 | 1099191600| [ OK ]
      |Changement hiver/ete 2005 | 1111888800| [ OK ]
      |Changement ete/hiver 2005 | 1130641200| [ OK ]
      |Changement hiver/ete 2006 | 1143338400| [ OK ]
      |Changement ete/hiver 2006 | 1152090800| [ OK ]
      |Changement ete/hiver 2007 | 1162040800| [ OK ]
      |Changement ete/hiver 2007 | 1172050800| [ OK ]
      |Changement ete/hiver 2008 |......................0|
      |Changement ete/hiver 2008 |......................0|
      • [^] # Re: avec awk

        Posté par  . Évalué à 3.

        On va écrire le programme awk en ajoutant du formattage :

        awk '
        BEGIN {flag=0};
        /1080439200/ {flag=1;}
        flag==1 {print $0 "[OK]"}' file_date.txt
        '


        Un ligne d'un script awk est composé d'une condition (avant les accolades) et d'un bout de code (entre les accolades). Toutes les lignes du programme sont évaluées pour chaque ligne du fichier.

        A la première ligne, on match BEGIN (début du fichier) et on assigne 0 à flag
        A la deuxième ligne, on fait en sorte que s'il y a 1080439200 sur la ligne du fichier on passe flag à 1
        A la troisième ligne, on affiche la ligne plus [OK] si flag est à un.

        Pour modifier le script il faudrait que flag passe à 0
        Tu peut donc rajouter un
        /1172050800/ { flag=0;} à la fin du script si tu veux afficher la ligne contenant 1172050800 ou en avant dernier si tu veux pas l'afficher.



        Maintenant, il y a peut être plus simple avec awk :

        awk -F'|' ' $3>=1080439200 && $3 <= 1172050800 {print $0" [OK]"}' file_dat.txt

        Avec -F je définis le séparateur à |. Awk sait ainsi comme séparer les champs.
        La condition est : Le troisième champ doit être supérieur ou égal à 1080439200 et inférieur ou égla à 1172050800. Dans ce cas on affiche la ligne entière ($0) en ajoutant [OK] à la fin

        J'imagine que tes nombres sont du timestamp unix et que tu veux donc isoler une période, c'est pour cela que les comparaisons peuvent fonctionner.
        • [^] # Re: avec awk

          Posté par  . Évalué à 0.

          Avec tes explications précises, j'ai pu adapter mon script a ma convenance, ça fonctionne.

          Encore Merci.. Merci beaucoup...
  • # bah moi je ferait avec read

    Posté par  . Évalué à 1.

    cat fich | while read ligne
    do
    traitement ( echo $ligne ) par exemple
    done

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

  • # man grep

    Posté par  . Évalué à 1.

    Première chose : éviter les cat qqc | grep.... grep peut en effet prendre des fichiers en paramètre

    Ensuite l'option -A (after context) te permet de dire qu'il faut afficher les N lignes suivant le match (en prenant un nombre de lignes "suffisant" ça arrive au bout du fichier)

    Enfin tu pipe la sortie pour la retraiter après.

    grep -A 1000000 1080439200 file_date.txt | while read i; do echo "$i[OK]";done



    L'exemple avec awk marche aussi assez bien mais il n'est peut être pas obligé de sortir la grosse artillerie pour si simple.
  • # sed ?

    Posté par  . Évalué à 5.

    $ cat file_date.txt
    |Changement hiver/ete 2003 | 1048989600|
    |Changement ete/hiver 2003 | 1067137200|
    |Changement hiver/ete 2004 | 1080439200|
    |Changement ete/hiver 2004 | 1099191600|
    |Changement hiver/ete 2005 | 1111888800|
    |Changement ete/hiver 2005 | 1130641200|
    |Changement hiver/ete 2006 | 1143338400|
    |Changement ete/hiver 2006 | 1162090800|
    $ sed '/1099191600/,$s/$/ [OK]/' file_date.txt
    |Changement hiver/ete 2003 | 1048989600|
    |Changement ete/hiver 2003 | 1067137200|
    |Changement hiver/ete 2004 | 1080439200|
    |Changement ete/hiver 2004 | 1099191600| [OK]
    |Changement hiver/ete 2005 | 1111888800| [OK]
    |Changement ete/hiver 2005 | 1130641200| [OK]
    |Changement hiver/ete 2006 | 1143338400| [OK]
    |Changement ete/hiver 2006 | 1162090800| [OK]
    $ sed '/1099191600/,/1143338400/s/$/ [OK]/' file_date.txt
    |Changement hiver/ete 2003 | 1048989600|
    |Changement ete/hiver 2003 | 1067137200|
    |Changement hiver/ete 2004 | 1080439200|
    |Changement ete/hiver 2004 | 1099191600| [OK]
    |Changement hiver/ete 2005 | 1111888800| [OK]
    |Changement ete/hiver 2005 | 1130641200| [OK]
    |Changement hiver/ete 2006 | 1143338400| [OK]
    |Changement ete/hiver 2006 | 1162090800|
    • [^] # Re: sed ?

      Posté par  . Évalué à 1.

      Arf.... je savais que ct faisable par sed.... !!! mais je maitrise pas assez bien le biniou... Merci en tout cas.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.