SED ou awk ou nawk

Bonjour,

Besoin d'un expert sed ou awk pour mettre tout sur la même ligne

CONDITION IN

PBIEXXD000 P_BIL_EDI START BIL EDI

CONDITION OUT

PBIEXXD030 P_BIL_EDI FINS8060 2626 PBIEXXD030
PEDIXXD021 P_BIL_EDI Transfert EDI FINB8050 BRDL to ECFRANCE PEDIXXD021

D'avance un grand merci.

Cdt.

31 réponses

Résumé de la discussion

Des échanges portent sur l'utilisation de sed ou awk pour mettre toutes les conditions sur une même ligne dans un fichier de règles, afin d'obtenir une sortie consolidée et lisible. Plusieurs propositions montrent l'emploi de sed -f avec des scripts comme new.sed ou new.new.sed sur des listes ALL_COND_IN_OUT.lst, avec des résultats séparés par des tabulations. Des échanges abordent aussi les limites selon les systèmes (AIX, Solaris, HP-UX, etc.) et l'absence de commande sed --version, conduisant à privilégier une vérification de version ou un ajustement du script. En parallèle, des échanges montrent que la sortie attendue peut être atteinte avec des scripts tabulés, mais nécessite encore des ajustements et des tests croisés entre entrée et sortie.

Bobot (l’IA à votre service)
  1. Contributeur
    Salut,

    Y compris les lignes vides ?
    0
    1. En supprimant les lignes vides.
      Mais je demande plus maintenant.
      J'aimerai afficher le résultat ci-dessous

      --- PBIBXXD025 ---

      CONDITION IN

      START DAILY PBIBXXD000
      PBILXXD010

      CONDITION OUT
      PBIBXXD030

      En forme de colonne. Colonne 1 NOM : PBIBXXD025
      2 CONDITION IN
      3 CONDITION OUT

      Est-ce possible ? J'ai un fichier contenant 10000 lignes auquels j'aimerai appliquer cette règle.

      Un grand merci d'avance.

      Cdt.Rahon
      0
      1. Contributeur
        Re-

        Est-ce que toutes les lignes devant faire l'objet d'un traitement commencent toujours par les mêmes motifs ? A savoir le nom par "---", les 2 autres champs par "CONDITION" ?

        Quel doit être le séparateur de champs ?
        0
    2. Oui toujours dans ce format là. Mais il faut ajouter à chaque fin de ligne une barre dièsé.

      ########################################

      Ce dernier peut servir de séparateur ?

      Cdt, rahon
      0
      1. Contributeur
        On peut voir un exemple concret de ce que tu veux réellement en sortie à partir de ton exemple ?

        En entrée tu as ça :
        -- PBIBXXD025 ---
        
        CONDITION IN
        
        START DAILY PBIBXXD000
        PBILXXD010
        
        CONDITION OUT
        PBIBXXD030
        
        -- PBIBXXD026 ---
        
        CONDITION IN
        
        START DAILY PBIBXXD000
        PBILXXD010
        
        CONDITION OUT
        PBIBXXD030
        

        Et en sortie tu veux quoi exactement ???
        0
    3. Voici ce que je veux

      -- PBIBXXD025 --- CONDITION IN CONDITION OUT

      START DAILY PBIBXXD000 PBIBXXD030

      PBILXXD010
      0
      1. Zut je veux 3 colonnes.

        JOB COND IN COND OUT
        - XXXXX - avec les cond in avec les cond out
        0
        1. Contributeur
          Un truc comme ça ?
          --- PBIBXXD025 --- CONDITION IN START DAILY ... CONDITION OUT PBIBXXD030
          --- PBIBXXD026 --- CONDITION IN START DAILY ... CONDITION OUT PBIBXXD031

          Et ces colonnes elles seront séparées par quoi ?
          0
      2. Oui comme cela. Elles seront séparées par des tabulations....

        Cdt, Rahon
        0
        1. Contributeur
          $ sed ':z;N;$!bz;s/\n/ /g;s/CON/\t&/g;s/ \(--- [A-Z]\)/\n\1/g;s/\s\+;/\t/g' plop
          --- PBIBXXD025 ---      CONDITION IN  START DAILY PBIBXXD000 PBILXXD010         CONDITION OUT PBIBXXD030
          --- PBIBXXD026 ---      CONDITION IN  START DAILY PBIBXXD001 PBILXXD010         CONDITION OUT PBIBXXD031
          --- PBIBXXD027 ---      CONDITION IN  START DAILY PBIBXXD002 PBILXXD010         CONDITION OUT PBIBXXD032
          
          $
          0
          1. Ouaouuuuuu un sacré SED, je test et te dis ca....

            plop c'est le fichier ????

            Cdt, Rahon
            0
            1. A mon avis je dois mal appliqué la commande.

              sed ':z;N;$!bz;s/\n/ /g;s/CON/\t&/g;s/ \(--- [A-Z]\)/\n\1/s/\s\+;/\t/g' ALL_COND_IN_OUT.lst (fichier regroupant toutes les données).
              <
              sed: The label :z;N;$!bz;s/\n/ /g;s/CON/\t&/g;s/ \(--- [A-Z]\)/\n\1/g;s/\s\+;/\t/g is greater than eight characters.
              0
              1. Pour etre plus clair voila comment sont les données dans le fichiers .

                --- P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025 ---

                CONDITION IN

                P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020

                CONDITION OUT

                P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999

                ########################################################################

                --- P_BIL_CFF_FOREIGN FINB8000 176 PBIFITD030 ---

                CONDITION IN

                P_BIL_CFF_FOREIGN START CFF FOREIGN PBIFXXD000

                CONDITION OUT

                P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040

                ########################################################################

                --- P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020 ---

                CONDITION IN

                P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010

                CONDITION OUT

                P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025

                ########################################################################
                0
                1. Contributeur
                  Quel système ?
                  Quelle version de sed ?
                  0
              2. System Unix
                Comment connaitre la version du sed ??
                0
                1. Contributeur
                  System Unix
                  Oui mais encore ? AIX? Solaris ? HP-UX ? SCO ? etc

                  Comment connaitre la version du sed ??
                  Ça dépend du système ;-(
                  Essaye "sed --version"
                  0
              3. AIX ecux0999 3 5 00C8324C4C00

                par contre le sed -version ou sed --version ne fonctionne pas.
                0
                1. Contributeur
                  Bon c'est pas grave.

                  Crées un fichier avec ce contenu :

                  $ cat rahon.sed
                  :z
                  N
                  $ !b z
                  s/\n/ /g
                  s/CON/\t&/g
                  s/ \(--- [A-Z]\)/\n\1/g
                  s/\s\+;/\t/g
                  s/##*/\n&/g


                  Et appelles-le comme suit :
                  $ sed -f rahon.sed fichier

                  0
                  1. Je teste et te fais un retour.
                    0
                    1. C pas mal, mais ca me donne ca

                      sed -f rahon.sed ALL_COND_IN_OUT.lst >> TOTO.txt

                      cat TOTO.txt

                      --- P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025 --- tCONDITION IN P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020 tCONDITION OUT P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 n########
                      ################################################################ n--- P_BIL_CFF_FOREIGN FINB8000 176 PBIFITD030 --- tCONDITION IN P_BIL_CFF_FOREIGN START CFF FOREIGN PBIFXXD000 tCO
                      NDITION OUT P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040 n######################################################################## n--- P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020 --- t
                      CONDITION IN P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 tCONDITION OUT P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025 n#################################################################
                      ####### n--- P_BIL_CFF_FOREIGN FINB0206 503 PBIFXXD026 --- tCONDITION IN P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 tCONDITION OUT P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999
                      n######################################################################## n--- P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 --- tCONDITION IN P_BIL_CFF_FOREIGN START CFF FOREIGN PBIFXXD0
                      00 tCONDITION OUT P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020 P_BIL_CFF_FOREIGN FINB0206 503 PBIFXXD026 n######################################################################## n
                      --- P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040 --- tCONDITION IN P_BIL_CFF_FOREIGN FINB8000 176 PBIFITD030 tCONDITION OUT P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 n########
                      ################################################################ n--- P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 --- tCONDITION IN P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025 P_BIL
                      _CFF_FOREIGN FINB0206 503 PBIFXXD026 P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040 tCONDITION OUT n######################################################################## n--- P_BIL_
                      CFF_FOREIGN START CFF FOREIGN PBIFXXD000 --- tCONDITION IN tCONDITION OUT P_BIL_CFF_FOREIGN FINB8000 176 PBIFITD030 P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 n#################
                      #######################################################

                      Ca me donne pas cela en forme de colonne.
                      0
                      1. Contributeur
                        Essaie de modifier ce qui est en gras :

                        :z
                        N
                        $ !b z
                        s/\x0a/ /g
                        s/CON/\x09&/g
                        s/ \(--- [A-Z]\)/\x0a\1/g
                        s/\s\+;/\x09/g
                        s/##*/\x0a&/g
                        0
                    2. Je reprendrais ce soir, en tout cas un grand merci à toi.
                      Je te dirais si cela a fonctionne encore merci pour ton aide.

                      Cdt, Rahon
                      0
                      1. Bonjour,

                        avec 3 jours de recul :), un peu de repos ca fais du bien.
                        J'ai donc tester ce que tu m'as dis mais je ne vois pas ou tu veux aller....

                        Quand j'execute ce que tu m'as donné sans rien modifier ca donne ca

                        x0a########################################################################

                        --- P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 ---

                        x09CONDITION IN

                        P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025
                        P_BIL_CFF_FOREIGN FINB0206 503 PBIFXXD026
                        P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040

                        x09CONDITION OUT

                        x0a########################################################################

                        Puis j'ai essayé de modifier les champs

                        $ cat gras*
                        :z
                        N
                        $ !b z
                        s/\x0a/ /g
                        s/CON/\IN/g
                        s/ \(--- [A-Z]\)/\x0a\1/g
                        s/\s\+;/\OUT/g
                        s/##*/ /g

                        Ca donne ca...

                        --- P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 ---

                        INDITION IN

                        P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025
                        P_BIL_CFF_FOREIGN FINB0206 503 PBIFXXD026
                        P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040

                        INDITION OUT

                        Je pense que je ne fais pas ce que tu aimerais que je teste...

                        Cdt, Rahon
                        0
                        1. Contributeur
                          Bon chez moi les 2 solutions marchent très bien et ne pouvant faire de tests sur un système AIX et sa version de "sed", je ne sais plus quoi te dire ;-(

                          Essaye avec ça (à mettre dans un fichier comme précédemment) :

                          #n
                          :debut
                          /^---/ {
                              h
                              :boucle
                              n
                              /^---/ !{
                                  H
                                  $ {
                                      b change
                                  }
                                  b boucle
                              }
                              :change
                              x
                              s/\n\n*\(CON\)/;\1/g
                              s/\n\n*/ /g
                              s/##*/\n&/g	
                              p
                          }
                          x
                          b debut
                          0
                      2. Oups,

                        $ sed -f new.sed ALL_COND_IN_OUT.lst
                        sed: Function s/##*/\n&/g cannot be parsed.
                        $ cat new.sed
                        #n
                        :debut
                        /^---/ {
                        h
                        :boucle
                        n
                        /^---/ !{
                        H
                        $ {
                        b change
                        }
                        b boucle
                        }
                        :change
                        x
                        s/\n\n*\(CON\)/;\1/g
                        s/\n\n*/ /g
                        s/##*/\n&/g
                        p
                        }
                        x
                        b debut
                        0
                        1. Contributeur
                          Protège les "#" :
                          s/\#\#*/\n&/g 
                          0
                      3. sed -f new.sed ALL_COND_IN_OUT.lst
                        sed: Function s/\#/\#*/\n&/g cannot be parsed.
                        $

                        sed -f new.sed ALL_COND_IN_OUT.lst
                        sed: Function s/\#\#*/\n&/g cannot be parsed.
                        $

                        Si près du but :)

                        Cdt
                        0
                        1. Contributeur
                          Supprime cette ligne on verra plus tard...
                          0
                      4. OUAOUUUUUUU

                        sed -f new.sed ALL_COND_IN_OUT.lst
                        --- P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025 ---;CONDITION IN P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020 ;CONDITION OUT P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 ########################################################################
                        --- P_BIL_CFF_FOREIGN FINB8000 176 PBIFITD030 ---;CONDITION IN P_BIL_CFF_FOREIGN START CFF FOREIGN PBIFXXD000 ;CONDITION OUT P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040 ########################################################################
                        --- P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020 ---;CONDITION IN P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 ;CONDITION OUT P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025 ########################################################################
                        --- P_BIL_CFF_FOREIGN FINB0206 503 PBIFXXD026 ---;CONDITION IN P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 ;CONDITION OUT P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 ########################################################################
                        --- P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 ---;CONDITION IN P_BIL_CFF_FOREIGN START CFF FOREIGN PBIFXXD000 ;CONDITION OUT P_BIL_CFF_FOREIGN FINB0201 379 PBIFXXD020 P_BIL_CFF_FOREIGN FINB0206 503 PBIFXXD026 ########################################################################
                        --- P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040 ---;CONDITION IN P_BIL_CFF_FOREIGN FINB8000 176 PBIFITD030 ;CONDITION OUT P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 ########################################################################
                        --- P_BIL_CFF_FOREIGN FIN CFF FOREIGN PBIFXXD0999 ---;CONDITION IN P_BIL_CFF_FOREIGN FINS0202 427 PBIFXXD025 P_BIL_CFF_FOREIGN FINB0206 503 PBIFXXD026 P_BIL_CFF_FOREIGN FINB8010 890 PBIFXXD040 ;CONDITION OUT ########################################################################
                        --- P_BIL_CFF_FOREIGN START CFF FOREIGN PBIFXXD000 ---;CONDITION IN;CONDITION OUT P_BIL_CFF_FOREIGN FINB8000 176 PBIFITD030 P_BIL_CFF_FOREIGN FINB2010 378 PBIFXXD010 ########################################################################

                        C vraiment pas mal du tout....
                        0
                        • 1
                        • 2