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

extraction d'une partie d'un fichier sous condition (sed) - Shell/Batch - Programmation

Marsh Posté le 01-06-2006 à 10:35:11    

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

Reply

Marsh Posté le 01-06-2006 à 10:35:11   

Reply

Marsh Posté le 02-06-2006 à 15:57:19    

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?
 

Reply

Marsh Posté le 02-06-2006 à 16:30:57    

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

Reply

Marsh Posté le 02-06-2006 à 16:50:20    

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

Reply

Marsh Posté le 06-06-2006 à 10:51:11    

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  

Reply

Marsh Posté le 07-06-2006 à 17:50:01    

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
 
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed