Forum Programmation.shell Bash, sed , awk ?

Posté par  .
Étiquettes : aucune
0
9
avr.
2007
Bonjour

Je travaille sur une extraction d'une base lotus qui se présente sous cette forme:

"","", "", (etc)
"","truc", "",(etc)
"","","",(etc)
"","","",(etc)
"","","",(etc)
.....
"","","",(etc)
"","Machin", "",(etc)
"","","",(etc)
....
"","","",(etc)
"","Chose", "",(etc)
...

comme ceci sur environ 20000 lignes....

J'ai besoin de remplacer , dans toutes les lignes qui suivent la ligne contenant "truc", le deuxième champ "" par "truc" , et ceci jusqu'à rencontrer la ligne contenant "Machin"

et ainsi de suite...

je me suis tapé le FM de sed, awk, grep et consorts, mais je patauge....

Merci de votre aide
  • # Python pardi

    Posté par  . Évalué à 0.

    > Bash, sed , awk ?

    -> Python !
  • # A tester !

    Posté par  (site web personnel) . Évalué à 3.

    En copiant les lignes ci-dessous dans remplace.sh:


    #!/bin/sh

    a_remplacer=""
    while read data; do
      fin=`echo $data | grep '^"[^#]*","Machin"'`
      if [ -n "$fin" ] ; then
        # Fin du traitement car "Machin" trouvé
        a_remplacer=""
        echo "$data"
      else
        if [ -n "$a_remplacer" ] ; then
          # Ligne dans laquelle il faut remplacer "" par "truc"
          ligne=`echo $data | sed 's/^\("[^"]*",\)\("[^"]*"\)\(.*\)/\1"truc"\3/'`
          echo "$ligne"
        else
          recherche=`echo $data | grep '^"[^"]*","truc"'`
          if [ -n "$recherche" ] ; then
            # A partir de maintenant il faut remplacer "" par "truc"
            a_remplacer="OUI"
          fi
          echo "$data"
        fi
      fi

    done


    et ensuite:
    ./remplace.sh < fichier_data > fichier_ok

    fichier_data = le fichier contenant les données à traiter
    fichier_ok = le fichier contenant les données traitées

    Après un rapide test et si j'ai bien compris ça semble à peu près faire ce que tu veux, mais bon .. à tester !
  • # awk bien sur

    Posté par  . Évalué à 2.

    Si j'ai bien compris, on a un truc du style :

    "","","","",""
    "","truc","","",""
    "","","","",""
    "","","","",""
    "","","","",""
    "","","","",""
    "","","","",""
    "","","","",""
    "","machin","","",""
    "","","","",""
    "","","","",""
    "","","","",""
    "","","","",""
    "","","","",""
    "","chose","","",""
    "","","","",""
    "","","","",""

    et on veut :
    "","","","",""
    "","truc","","",""
    "","truc","","",""
    "","truc","","",""
    "","truc","","",""
    "","truc","","",""
    "","truc","","",""
    "","truc","","",""
    "","machin","","",""
    "","machin","","",""
    "","machin","","",""
    "","machin","","",""
    "","machin","","",""
    "","machin","","",""
    "","chose","","",""
    "","chose","","",""
    "","chose","","",""

    Si c'est bien ça, alors le programme awk suivant le fait :

    BEGIN {rempl = "\"\""; FS = ","; OFS = ",";}

    {
    if ($2 == "\"\"")
    $2 = rempl;
    else
    rempl = $2;
    print;
    }
    • [^] # Re: awk bien sur

      Posté par  . Évalué à 1.

      Cool , ça marche !! Merci beaucoup ...
      Bon, ya bien un retour chariot indésirable, mais rien de bien grave, je devrais m'en sortir avec sed
      (quoique si je trouve la soluce ici .... ;o)


      Merci encore (à tous, bien entendu !!)

      Michel
  • # sed!

    Posté par  . Évalué à 0.

    la commande sed me parait la plus adapter a ton probleme...
    pour une aide efficace je te conseille initiation au script shell ou ton cas est clairement expliquer (d apres un exemple sur le fichier password)
    sed est tres efficace malgres une syntaxe hyper chiante

    dommage j ai pas le book sous les yeux sinon je me serais fait un plaisir de te faire un .sh
  • # grep + head + tail + sed

    Posté par  (site web personnel) . Évalué à 1.

    Perso, c'est la solution que j'utiliserais.

    grep -n 'pattern' 'file' permet de savoir a quelle ligne du fichier se trouve un pattern particulier. Les numéros de lignes sont afichés au début.

    dur -d'delimiter' -f1 permet de couper les lignes données en entrée selon le délimiteur donné et de prendre le 1er chanp. Cela permet d'extraire le numéro de ligne de la commande grep.

    head -n x permet de récupérer le début d'un fichier en comptant les lignes a partir du début ou de la fin. tail -n x fait la même chose en prenant les dernières lignes d'un fichier

    sed permet de faire la substitution.

    Avec les expressions régulières, il faut faire attention car le résultat n'est pas toujours très fiable. Ce que je veux dire c'est qu'écrire une regexp qui correspond a une certaine donnée est facile, mais pour s'assurer qu'aucune autre ligne ne correspond pas, c'est moins facile. Cela dépend de tes données en entrée et de ton expression.

    Après, c'est vrai que des langages plus évolués comme perl, awk, python, ... sont peut être plus adaptés.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.