Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1784 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  extraction d'une partie d'un fichier sous condition (sed)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

extraction d'une partie d'un fichier sous condition (sed)

n°1378623
oqp24
No comment
Posté le 01-06-2006 à 10:35:11  profilanswer
 

Extraction de chaine avec sed
Sur Unix, j’ai un fichier composé de plusieurs paragraphes.
Tous les paragraphes commence par DDD et finissent par FFF.
Certain paragraphes contiennent la chaine XXX.
 
Exemple
DDDblablabla
blablablalll
blablablammmmmmmm
FFF blablablass
DDD blablabla
blablablaoo
lsdqkgsqdXXX blablabla
FFF blablabladd
DDD blablablaqq
blablablasd
FFF blablabla
 

  • Comment extraire les paragraphes contenant la chaine XXX.(Parag 2)
  • Comment extraire les paragraphes ne contenant pas la chaine XXX. (Parag 1 et 3)


sed -en "/^DDD/ , /^FFF/p" -en "/XXX/w resultat" file
extrait tout le fichier moins la ligne contenant  XXX
 
J’ai tourné le sed et le awk dans tous les sens mais je n’avance plus.
Merci

mood
Publicité
Posté le 01-06-2006 à 10:35:11  profilanswer
 

n°1379992
youx21
Posté le 02-06-2006 à 15:57:19  profilanswer
 

aie, sa pique la tête ça!  je pense que je le ferais par prog je ne metrise pas assez sed/awk pour ça.. mais pourquoi ne pas isoler les paragraphes dans un premier temps en cherchant les marqueurs (avec sed), et chercher dedans la presence/absence de tes chaineS?
 

n°1380042
youx21
Posté le 02-06-2006 à 16:30:57  profilanswer
 

bon, je reviens à ton problème, codé mais sans sed/awk... façon brutal. le code à la fin est à personnaliser. Par contre curieux de voir le résultat avec sed/awk, le code risque d'etre dense  :D  
 

Code :
  1. #!/bin/sh
  2. L_DEBUT="FALSE"
  3. L_FIN="FALSE"
  4. echo "">/tmp/file.$$
  5. for ligne in `cat test.txt`
  6. do
  7. # # # # # # # # # # # # # # # # # # #
  8.  # Test debut
  9. test=`echo $ligne | grep 'DDD[A-Za-z]*'`
  10. if [ "$test" != "" ]
  11. then
  12.  L_DEBUT="TRUE"
  13. fi
  14. # # # # # # # # # # # # # # # # # # #
  15. # # # # # # # # # # # # # # # # # # #
  16. # Test fin
  17. test=`echo $ligne | grep 'FFF[A-Za-z]*'`
  18. if [ "$test" != "" ]
  19. then
  20.  L_FIN="TRUE"
  21. fi
  22. # # # # # # # # # # # # # # # # # # #
  23. # # # # # # # # # # # # # # # # # # #
  24. # Dès que l'on a trouvé un début de paragraphe
  25. # on concatène
  26. if [ "$L_DEBUT" = "TRUE" ]
  27. then
  28.  echo $ligne>>/tmp/file.$$
  29. fi
  30. # # # # # # # # # # # # # # # # # # #
  31. # Si l'on a les deux marqueur debut/fin
  32. # on cherche la présence/absence de caractère
  33. # ici le fichier temporaire doit etre utiliser
  34. # comme contenant le paragraphe. A personnaliser donc!
  35. if [ "$L_DEBUT" = "TRUE" -a "$L_FIN" = "TRUE" ]
  36. then
  37.  L_DEBUT="FALSE"
  38.  L_FIN="FALSE"
  39.  test=`grep   'XXX' /tmp/file.$$`
  40.  if [ "$test" != "" ]
  41.  then
  42.   echo "paragraphe trouvé!"
  43.  fi
  44.   echo "">/tmp/file.$$
  45. fi
  46. # # # # # # # # # # # # # # # # # # #
  47. done

n°1380064
anapajari
s/travail/glanding on hfr/gs;
Posté le 02-06-2006 à 16:50:20  profilanswer
 

en perl en une ligne :o
pour ceux avec XXX

Code :
  1. perl -00 -ne '@a =( /(D{3}[^F{3}]*?X{3}.*?F{3})/s);foreach(@a){ print $a[$_]."\n\n";}' tonfichier


pour ceux sans:

Code :
  1. perl -00 -ne '@a =( /(D{3}[^F{3}|X{3}]*?F{3})/s);foreach(@a){ print $a[$_]."\n\n";}' tonfichier

n°1381858
oqp24
No comment
Posté le 06-06-2006 à 10:51:11  profilanswer
 

J'ai eu la reponse et j'imagine qu'elle vous interesse.
 
$ sed -e's/\(^DDD.*\)/RECORD_SEP\1/' -e 's/\(^FFF.*\)/\1RECORD_SEP/' test |awk 'BEGIN{ RS="RECORD_SEP" } /DDD.*XXX.*FFF.*/ { print $0 }'
DDD blablabla
blablablaoo
lsdqkgsqdXXX blablabla
FFF blablabladd
$ sed -e's/\(^DDD.*\)/RECORD_SEP\1/' -e 's/\(^FFF.*\)/\1RECORD_SEP/' test |awk 'BEGIN{ RS="RECORD_SEP" } !/DDD.*XXX.*FFF.*/ && /DDD.*FFF.*/ { print $0 }'
DDDblablabla
blablablalll
blablablammmmmmmm
FFF blablablass
DDD blablablaqq
blablablasd
FFF blablabla
 
c'est simple et efficace  

n°1383064
gloo
Posté le 07-06-2006 à 17:50:01  profilanswer
 

ma version, que avec SED :
 
 
 
cat MonFichier | sed -n '/^DDD/,/^FFF/{
H
/^FFF/g
}
/DDD.*.*FFF/{
/DDD.*XXX.*FFF/w avec.txt
/DDD.*XXX.*FFF/!w sans.txt
s/^.*$//
x
}

'

 
PS: les retours a la ligne sont necessaires du fait des "{", "}"
eventuellement, ce qui est en rouge, tu le mets dans un fichier et tu fais  
 
cat MonFichier | sed -n -f FicCommandeSED.txt
 
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  extraction d'une partie d'un fichier sous condition (sed)

 

Sujets relatifs
ouverture d'un fichier excel avec vbaCreer tables à partir d'un fichier texte
VB/excel lire une partie de cellule,faire des comparaisons(sr 2 Feuil)[tomcat] telechargement de fichier lent
Linux - Redirection de la sortie vers un fichiersauvegarde de fichier
Probleme de condition dans mes requetes, :'( help [RESOLU] !!Executer du SQL en js sans fichier php annexe...c'est possible?
importer un fichier de format .FRXCréation d'une base de donneés à partir d'un fichier XML en VB.NET
Plus de sujets relatifs à : extraction d'une partie d'un fichier sous condition (sed)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR