JPetrucci
Habitué
Bonjour,
j'ai un fichier (.log) dans lequel en gros j'ai des patterns de données par exemple de 4 lignes :
1.blablabla texte
2.données 1
3.données 2
4.ligne vide
5.blablabla texte
6.données 1
7.données 2
8.ligne vide
9.etc...
bref j'ai des tas de ligne et ce que je voudrais c'est extraire par exemple une ligne sur 4 à partir de la 2e ligne pour placer toutes les données 1 (ou données2, et même le texte) du pattern dans un fichier txt par exemple.
(En fait même l'idéal, plutôt que de faire 3 scripts pour récupérer les 3 lignes à chaque fois dans 3 fichiers différents puis de les concaténer avec paste ensuite, ce serait de faire ça en une fois dans mon script)
Et là je bloque, j'ai regardé sur le net sur d'autres forums pour tenter de m'inspirer d'utilisation de fonctions genre awk ou grep mais je n'arrive pas à les utiliser de façon à faire ce que je souhaite faire.
Voici un extrait de mon script (mais qui en plus n'est pas reconnu, quand je le lance ça me fait une erreur "command not found") :
testscript
[cpp]#! /bin/bash
for i in 'seq 1 194' ;
x=4*i - 1
do
awk 'NR==x' fichier.log > données1.txt
done[/cpp]
ou aussi j'ai tenté une une version alternative mais qui ne marche pas non plus :
[cpp]awk ' BEGIN
{
for (i=1;i<=194;i++)
{
x=i*4 - 1
print $x
}
}
END ' /home/chemin/fichier.log > données1.txt
[/cpp]
je précise que quand je le lance je suis dans le répertoire où il est, que je l'ai rendu exécutable en faisant "chmod a+x testscript".
Le 194 c'est parce que y'a 194 patterns de 4 lignes, donc j'ai voulu boucler ça mais je suis pas sûr de m'y être bien pris.
Mon fichier log si ça peut vous aider ressemble à ça :
[cpp]
Apr 15 11:49 [nomdufichiertraité1.fits[*,1]]:
1974.419 1.117 -1.26 1.126 -1.62 73.02 0.
( 764.87) ( ) (9.4) ( 8.427) (2.7) ( 395.4) ( 0.)
Apr 15 11:49 [nomdufichiertraité2.fits[*,1]]:
1984.702 1.265 -8.55 0.676 -9.72 8.268 0.
( 1.6385) ( ) (3.2) ( 0.2504) (3.6) ( 4.219) ( 0.)
etc...
[/cpp]
Ce que je voudrais faire pour résumer donc, c'est créer un fichier de 3 colonnes et 194 lignes contenant :
- en 1ere colonne le nom du fichier traité (donc là je suppose que je dois boucler un cut -c en précisant d'où à où je coupe de sorte à ne pas garder les "[" ainsi que la date et le reste des caractères non désirés, ou alors un grep?)
- en 2e colonne une donnée particulière de la 2e ligne (par exemple la 3e donnée, là aussi je vais de voir utiliser un cut je pense, ou un awk même puisqu'elles sont déjà en colonnes)
- en 3e colonne idem une donnée particulière entre parenthèses de la 3e ligne, par exemple la 3e donnée aussi si je décide de sélectionner la 3e sur la ligne du dessus
Voilà en gros mon problème, dans les scripts que j'ai commencé à faire je me contentais d'abord d'essayer d'extraire une ligne particulière, alors déjà que je n'y suis pas arrivé je n'ai pas encore essayé de faire le reste, mais si vous avez des pistes cela m'aiderait beaucoup !
merci d'avance de votre aide et n'hésitez pas à me redemander des trucs si je n'ai pas été assez clair ou pas assez complet
Julien
j'ai un fichier (.log) dans lequel en gros j'ai des patterns de données par exemple de 4 lignes :
1.blablabla texte
2.données 1
3.données 2
4.ligne vide
5.blablabla texte
6.données 1
7.données 2
8.ligne vide
9.etc...
bref j'ai des tas de ligne et ce que je voudrais c'est extraire par exemple une ligne sur 4 à partir de la 2e ligne pour placer toutes les données 1 (ou données2, et même le texte) du pattern dans un fichier txt par exemple.
(En fait même l'idéal, plutôt que de faire 3 scripts pour récupérer les 3 lignes à chaque fois dans 3 fichiers différents puis de les concaténer avec paste ensuite, ce serait de faire ça en une fois dans mon script)
Et là je bloque, j'ai regardé sur le net sur d'autres forums pour tenter de m'inspirer d'utilisation de fonctions genre awk ou grep mais je n'arrive pas à les utiliser de façon à faire ce que je souhaite faire.
Voici un extrait de mon script (mais qui en plus n'est pas reconnu, quand je le lance ça me fait une erreur "command not found") :
testscript
[cpp]#! /bin/bash
for i in 'seq 1 194' ;
x=4*i - 1
do
awk 'NR==x' fichier.log > données1.txt
done[/cpp]
ou aussi j'ai tenté une une version alternative mais qui ne marche pas non plus :
[cpp]awk ' BEGIN
{
for (i=1;i<=194;i++)
{
x=i*4 - 1
print $x
}
}
END ' /home/chemin/fichier.log > données1.txt
[/cpp]
je précise que quand je le lance je suis dans le répertoire où il est, que je l'ai rendu exécutable en faisant "chmod a+x testscript".
Le 194 c'est parce que y'a 194 patterns de 4 lignes, donc j'ai voulu boucler ça mais je suis pas sûr de m'y être bien pris.
Mon fichier log si ça peut vous aider ressemble à ça :
[cpp]
Apr 15 11:49 [nomdufichiertraité1.fits[*,1]]:
1974.419 1.117 -1.26 1.126 -1.62 73.02 0.
( 764.87) ( ) (9.4) ( 8.427) (2.7) ( 395.4) ( 0.)
Apr 15 11:49 [nomdufichiertraité2.fits[*,1]]:
1984.702 1.265 -8.55 0.676 -9.72 8.268 0.
( 1.6385) ( ) (3.2) ( 0.2504) (3.6) ( 4.219) ( 0.)
etc...
[/cpp]
Ce que je voudrais faire pour résumer donc, c'est créer un fichier de 3 colonnes et 194 lignes contenant :
- en 1ere colonne le nom du fichier traité (donc là je suppose que je dois boucler un cut -c en précisant d'où à où je coupe de sorte à ne pas garder les "[" ainsi que la date et le reste des caractères non désirés, ou alors un grep?)
- en 2e colonne une donnée particulière de la 2e ligne (par exemple la 3e donnée, là aussi je vais de voir utiliser un cut je pense, ou un awk même puisqu'elles sont déjà en colonnes)
- en 3e colonne idem une donnée particulière entre parenthèses de la 3e ligne, par exemple la 3e donnée aussi si je décide de sélectionner la 3e sur la ligne du dessus
Voilà en gros mon problème, dans les scripts que j'ai commencé à faire je me contentais d'abord d'essayer d'extraire une ligne particulière, alors déjà que je n'y suis pas arrivé je n'ai pas encore essayé de faire le reste, mais si vous avez des pistes cela m'aiderait beaucoup !
merci d'avance de votre aide et n'hésitez pas à me redemander des trucs si je n'ai pas été assez clair ou pas assez complet
Julien