Léa-Linux & amis :   LinuxFR   GCU-Squad   GNU
[shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

Bonjour,

j'ai une commande (propriétaire) qui me créer un fichier comme suit :
IMAGE xxx xxx xxx xxx
FLAG 1 yyy yyy yyy yyy
FLAG 2 zzz zzz zzz zzz
IMAGE xxx xxx xxx xxx
FLAG 1 yyy yyy yyy yyy
FLAG 2 zzz zzz zzz zzz
...

j'ai besoin du résultat suivant:
IMAGE xxx xxx xxx xxx FLAG 2 zzz zzz zzz zzz
IMAGE xxx xxx xxx xxx FLAG 2 zzz zzz zzz zzz
...

je suis passer par un grep -v pour enlever la ligne "FLAG 1 yyy yyy yyy yyy".
Mais comment faire pour que chaque ligne commencant par IMAGE concatène la ligne suivante (mieux si elle contient FLAG 2"

en vi je sais qu'on peut le faire avec J, mais en automatique avec sed je ne sais pas faire.

merci de votre aide

Poste le Wednesday 18 February 2009 14:16:07
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: NBaH

Voici le genre de choses qu'il ne semble pas possible de faire avec une seule commande sed.
echo "IMAGE xxx xxx xxx xxx
FLAG 1 yyy yyy yyy yyy
FLAG 2 zzz zzz zzz zzz
IMAGE xxx xxx xxx xxx
FLAG 1 yyy yyy yyy yyy
FLAG 2 zzz zzz zzz zzz " |\
 sed '/^IMAGE/{n;d;}' test/footix.dat |\
 sed '/./N; s/\n/ /'
IMAGE xxx xxx xxx xxx FLAG 2 zzz zzz zzz zzz
IMAGE xxx xxx xxx xxx FLAG 2 zzz zzz zzz zzz
cf. sed1line

Poste le Wednesday 18 February 2009 15:27:46
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

merci, cela me donne un bon début.
mais avec cette commande je n'ai que " IMAGE xxx xxx xxx xxx IMAGE xxx xxx xxx xxx"
et pas de ligne contenant FLAG.

je regarde du coté de sed1line et je fait des tests mais ce n'est pas du tout évident.

mais pour simplifier, on peut partir du principe que dans notre fichier "fic.in" de départ, on a:
IMAGE xxx xxx xxx xxx
FLAG 2 zzz zzz zzz zzz
IMAGE xxx xxx xxx xxx
FLAG 2 zzz zzz zzz zzz

merci

Poste le Wednesday 18 February 2009 16:10:18
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: NBaH

oops, j'ai laissé trainé un nom de fichier que tu n'as pas sur ton disque, qui m'a servi pour les tests.
Donc, la commande à utiliser est, soit
output | sed '/^IMAGE/{n;d;}' | sed '/./N; s/\n/ /' 
soit
sed '/^IMAGE/{n;d;}' /chemin/fichier | sed '/./N; s/\n/ /'
, mais évidemment pas les deux !

Sur Lenny (avec GNU sed version 4.1.5), ça fonctionne
...

Poste le Wednesday 18 February 2009 16:26:17
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

tu peux m'expliquer ta commande :
sed '/^IMAGE/{n;d;}' fichier.in | sed '/./N; s/\n/ /' >fichier.out3

avec ça je n'ai partiquement pas de FRAG (en fait j'en ai 3)


par contre en partant dans le sens contraire (recherche FRAG et joinds à la ligne du dessus) j'ai un meilleur résultat mais je ne comprends pas trop ce que je fais.
sed -e :a -e '$!N;s/\nFRA/ FRA/;ta' -e 'P;D' fichier.in >fichier.out4
(tiré de l'exemple de ton lien)

pour info:
fichier.in 273 lignes
fichier.out3 69 lignes
fichier.out4 135 lignes

Poste le Wednesday 18 February 2009 16:41:47
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: NBaH

Si une ligne commence par IMAGE ( /^IMAGE/ ), on passe à la ligne suivante ( n; ), on la supprime( d; ).

D'après le fic.in que tu as donné dans ton premier post, on obtient
IMAGE xxx xxx xxx xxx
FLAG 1 yyy yyy yyy yyy supprimée
FLAG 2 zzz zzz zzz zzz
IMAGE xxx xxx xxx xxx
FLAG 1 yyy yyy yyy yyy supprimée
FLAG 2 zzz zzz zzz zzz

La seconde commande sed, considère la première ligne non vide ( /./ ), ajoute la suivante au tampon ( N ), et remplace le passage à la ligne par un espace ( s/\n/ / ).

Poste le Wednesday 18 February 2009 17:06:51
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

excellent, merci beaucoup.

c'est vrai qu'ensuite je partais avec le fichier sans flag2.

je vais quand même essayer de comprendre un peu mieux la commande que j'ai fait.

A+

Poste le Thursday 19 February 2009 09:23:01
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

petite complication :+)

Donc au résultat je dois avoir :
IMAGE xxx xxx xxx xxx FLAG 2 zzz zzz zzz zzz

mais:
il se peut qu'il y ai plusieurs "FLAG 1" a la suite
et encore plus rare plusieurs "FLAG 2"

donc ce qui serait bien c'est de virer les lignes "FLAG 1" et quand il y a plusieurs "FLAG 2" de dupliquer la ligne IMAGE.

je me fais bien comprendre ??

Poste le Thursday 19 February 2009 15:51:06
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

maintenant je parts sur le principe suivant:

ma_commande |grep -v "FLAG 1" >fic1

comme ça dans le fichier je n'ai plus que des lignes contenant:
IMAGE xxx xxx xxx xxx
FLAG 2 zzz zzz zzz zzz
IMAGE xxx xxx xxx xxx
FLAG 2 zzz zzz zzz zzz
FLAG 2 zzz zzz zzz zzz

je pense qu'il faut partir de la fin du fichier et faire un test genre

si ligne commence par FLAG2 ET ligne du dessus commence par IMAGE
  alors
    on concatene sur la ligne du dessus
  sinon
    si ligne commence par FLAG2 ET ligne du dessus commence par FLAG2
      alors
        on prend la première ligne du dessus qui commence par IMAGE
        on la duplique au dessus de la ligne courante
        on concatene sur la ligne du dessus
   finsi
finsi



qu'en pensez vous ?

Poste le Friday 20 February 2009 09:27:41
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: NBaH

Bon, j'ai craqué, et je suis allé demander de l'aide sur la liste des utilisateurs de sed.
La réponse ne s'est pas faite attendre :
sed '/^IMAGE/{h;d;}; /^FLAG 1/d; /^FLAG 2/{G; s/\(.*\)\n\(.*\)/\2 \1/}'
Donc,
on retient la ligne IMAGE, et on empêche son affichage
on empêche l'affichage de FLAG 1
on affiche la ligne FLAG 2 en rappelant la ligne IMAGE retenue.
Ensuite, on concatène les deux lignes en inversant les propositions.

Poste le Friday 20 February 2009 19:43:11
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

merci,
mais dans le résultat je n'ai pas de lignes contenant IMAGE xxx xxx xxx xxx.

je sais que je vous saoul, mais ça fait plusieurs jours que je me prends la tete sur ce problème (que je trouve intéressant).
merci de votre patience

Poste le Monday 23 February 2009 15:02:16
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: NBaH

Je ne sais pas quoi te dire.

Pour moi, ça fonctionne impec.

Le fichier à traiter n'a pas changé ? les motifs sont toujours les mêmes ?

Si c'est un fichier Window$, y as-tu appliqué la commande fromdos, pour convertir (entre autre) les retours à la ligne ?

Poste le Monday 23 February 2009 15:36:36
Répondre     Citer    
Re: [shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Envoyé par: footix06

désolé, je suis vraiment un âne, c'est une erreur de frappe (non ne tappez pas !!).
ça fonctionne nickel.

merci à vous pour cet excellent travail.

Poste le Tuesday 24 February 2009 09:03:32
Répondre     Citer    

Veuillez vous authentifier auparavant pour commenter.

 

Ce forum !
[shell] concaténer une ligne sur 2 ou 3 d'un même fichier
Pour poser vos questions sur les scripts shell, le Perl, le C, etc... Attention : nous ne sommes pas des spécialistes du dev, ce forum est juste pour de petites aides ponctuelles concernant le développement et les outils de développement.

Sauf mention contraire, les documentations publiées sont sous licence Creative-Commons