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.
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 xusnet . Évalué à 1.
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 Damien Metzler . Évalué à 3.
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 xusnet . Évalué à 0.
Encore Merci.. Merci beaucoup...
# bah moi je ferait avec read
Posté par fearan . Évalué à 1.
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 Damien Metzler . Évalué à 1.
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 lcld . Évalué à 5.
|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 Damien Metzler . Évalué à 1.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.