Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/07/2011, 10h48   #1
Candidat au titre de Membre du Club
 
Homme
Administrateur systèmes et réseaux
Inscription : juillet 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : juillet 2011
Messages : 5
Points : 11
Points : 11
Par défaut besoin d'aide pour concaténer

Bonjour à tous,

J'ai un fichier sous cette forme;

2011-07-22 08:00 toto titi tata
2011-07-22 08:00 1 2 3
4 5 6
2011-07-22 08:01 tic tac
2011-07-22 08:02
a b c d
2011-07-22 08:03 foo bar

Je voudrais que toutes les lignes qui ne commence pas par une date (YYYY-MM-DD HH:MM) remonte à la fin de la ligne précédente.
Dans mon exemple ça devrait donner ça ;

2011-07-22 08:00 toto titi tata
2011-07-22 08:00 1 2 3 4 5 6
2011-07-22 08:01 tic tac
2011-07-22 08:02 a b c d
2011-07-22 08:03 foo bar

Je pense que la fonction append (a) de sed pourrais bien faire l'affaire mais j'ai du mal la!

Merci pour votre aide :o)
gossebif est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 13h36   #2
Membre émérite
 
Avatar de Pouic
 
Inscription : octobre 2004
Messages : 668
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2004
Messages : 668
Points : 904
Points : 904
Code :
awk --re-interval '/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf "\n" $0 " " } !/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf $0}' file.txt
Ca te rajoute simplement une ligne vide en tête, mais bon, ça se vire facilement avec sed par exemple
__________________
Software becomes slower faster than hardware becomes faster

http://xrenault.developpez.com
API C standard (C ANSI )
Pouic est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 14h15   #3
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

En misant sur le fait qu'aucune ligne autre que les dates ne commencent par plusieurs chiffres suivis d'un tiret

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ cat plop
2011-07-22 08:00 toto titi tata
2011-07-22 08:00 1 2 3
4 5 6
2011-07-22 08:01 tic tac
2011-07-22 08:02
a b c d
2011-07-22 08:03 foo bar

$ sed -n '$p;N;/\n[[:digit:]]*-/{P;D};s/\n/ /p' plop
2011-07-22 08:00 toto titi tata
2011-07-22 08:00 1 2 3 4 5 6
2011-07-22 08:01 tic tac
2011-07-22 08:02 a b c d
2011-07-22 08:03 foo bar
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 14h59   #4
Candidat au titre de Membre du Club
 
Homme
Administrateur systèmes et réseaux
Inscription : juillet 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : juillet 2011
Messages : 5
Points : 11
Points : 11
Citation:
Envoyé par zipe31 Voir le message
Salut,
En misant sur le fait qu'aucune ligne autre que les dates ne commencent par plusieurs chiffres suivis d'un tiret
Je serais plus rassurer avec l'heure en plus dans la regexp mais ça je devrait pouvoir le faire.

Citation:
Envoyé par zipe31 Voir le message
$ sed -n '$p;N;/\n[[:digit:]]*-/{P;D};s/\n/ /p' plop
Yes! On y est presque... je m'explique!
Mon fichier exemple n'était pas complet. Je voudrais pouvoir gerer aussi et surtout ce cas la ;

2011-07-22 08:00 1 2 3
4
5
6
2011-07-22 08:01 tic tac

Il peut y avoir plusieurs ligne qui ne commencent pas par une date à la suite :o)
gossebif est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 15h02   #5
Candidat au titre de Membre du Club
 
Homme
Administrateur systèmes et réseaux
Inscription : juillet 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : juillet 2011
Messages : 5
Points : 11
Points : 11
Citation:
Envoyé par Pouic Voir le message
Code :
awk --re-interval '/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf "\n" $0 " " } !/^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}/{printf $0}' file.txt
Ca te rajoute simplement une ligne vide en tête, mais bon, ça se vire facilement avec sed par exemple
Ca marche nickel, même dans le cas ou il y a plusieurs ligne à la suite qui ne commence pas par une date! Kool :o) En revanche la commande est flippante! Je trouve le sed plus sexy ^^
Je vais faire des tests de perf sur mes fichiers log de 800mo pour choisir une fois que j'aurai les 2 syntaxes!

Merci a vous deux encore une fois!
gossebif est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 15h09   #6
Membre émérite
 
Avatar de Pouic
 
Inscription : octobre 2004
Messages : 668
Détails du profil
Informations personnelles :
Âge : 28
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2004
Messages : 668
Points : 904
Points : 904
Citation:
Envoyé par gossebif Voir le message
Ca marche nickel, même dans le cas ou il y a plusieurs ligne à la suite qui ne commence pas par une date! Kool :o) En revanche la commande est flippante! Je trouve le sed plus sexy ^^
En même temps, c'est simplement
Code :
/mon_pattern/{ do something }  !/mon_pattern/{do something else}
:-)
Après, tu peux alléger : là, je t'ai mis mon_pattern pour matcher exactement le format de date, mais après, tu peux peut-être te contenter de matcher l'année suivie d'un tiret, ça dépend ensuite de tes données :-)
__________________
Software becomes slower faster than hardware becomes faster

http://xrenault.developpez.com
API C standard (C ANSI )
Pouic est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 15h11   #7
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Voilà, en tenant compte de la date plus précisément et de plusieurs lignes consécutives sans date...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ cat plop                                                                   
2011-07-22 08:00 toto titi tata
2011-07-22 08:00 1 2 3
4 5 6
7
8
2011-07-22 08:01 tic tac
2011-07-22 08:02
a b c d
2011-07-22 08:03 foo bar
7 8 9
10
b n

$ sed -n ':z;$p;N;/\n[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/{P;D};s/\n/ /;bz' plop
2011-07-22 08:00 toto titi tata
2011-07-22 08:00 1 2 3 4 5 6 7 8
2011-07-22 08:01 tic tac
2011-07-22 08:02 a b c d
2011-07-22 08:03 foo bar 7 8 9 10 b n
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 15h20   #8
Candidat au titre de Membre du Club
 
Homme
Administrateur systèmes et réseaux
Inscription : juillet 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : juillet 2011
Messages : 5
Points : 11
Points : 11
Les deux méthodes fonctionnent nickel, merci à vous deux!

Citation:
Envoyé par zipe31 Voir le message
$ sed -n ':z;$p;N;/\n[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}/{P;D};s/\n/ /;bz' plop
Je ne voudrais pas abuser de ta gentillesse mais serait il possible de détailler un peu la syntaxe (hormis cette partie \n[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\})
gossebif est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/07/2011, 15h39   #9
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Code :
sed -n ':z;$p;N;/motif/{P;D};s/\n/ /;bz'
Citation:
sed -n '
Affichage sur demande uniquement (conjointement avec le flag "p" ou "P")

:z
Étiquette de branchement

$p
Si dernière ligne, on l'affiche. (Sans ça, la dernière ligne n'est pas traitée.)

N
On ajoute la ligne suivante dans la mémoire principale (buffer/tampon)

/motif/{
Pour un motif correspondant, exécuter les actions contenues entre les accolades (groupement de commandes)

P
On affiche sur la sortie standard la 1ère partie de la mémoire principale jusqu'au 1er saut de ligne (\n)

D
On supprime la 1ère partie de la mémoire principale jusqu'au 1er saut de ligne (\n) et on recommence un nouveau cycle avec la 2nd partie toujours présente dans le buffer.

}
Fin du groupement de commandes

s/\n/ /
Si le motif ne correspond pas, on substitue le saut de ligne par un espace

bz'
On se branche à l'étiquette.
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 22/07/2011, 15h50   #10
Candidat au titre de Membre du Club
 
Homme
Administrateur systèmes et réseaux
Inscription : juillet 2011
Messages : 5
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Administrateur systèmes et réseaux
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : juillet 2011
Messages : 5
Points : 11
Points : 11
Citation:
Envoyé par zipe31 Voir le message
Code :
sed -n ':z;$p;N;/motif/{P;D};s/\n/ /;bz'


Un grand MERCI!

Très bonne journée à vous ;o)
gossebif est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h12.


 
 
 
 
Partenaires

Hébergement Web