Forum Programmation.shell couper colonne dans 4 variables

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
-1
15
avr.
2016

Hi ALL!
J'ai une colonne dans un fichier a.text. Cette colonne doit être divisé en 4 et envoyé dans 4 variable différentes.

L'idée est que je lis ce fichier avec une boucle, mais j'envoie les résultats dans 4 variables diferentes. Le script sera en kornshell. Pouvez-vous m'aider la dessus svp…

  • # c'est simple...

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

    man read,
    ou
    man awk
    ou man sed

    et http://abs.traduc.org/abs-fr/index.html

    avec cela tu devrais réussir

    Ensuite en fonction du formatage de tes variables, des solutions sont a privilégier….

    Tu peux poster ici ce que tu as fait, il y aura toujours qqun pour t'aider a résoudre les problèmes que tu rencontres…; par contre, personne ne fera le script à ta place ;o)

    • [^] # Re: c'est simple...

      Posté par  . Évalué à 1.

      Simple pour toi, pas pour moi
      voici l'idée

      comm_qui_crache | grep blabla | awk '{print $1}'| awk -F ":" '{print $2}' > fichier/a.tex

      de ce fichier/a.tex je souhaite faire une boucle assez simple (complexe pour moi) qui redirigera
      le contenu de notre colonne sur 4 variables

      for i in cat fichier/a.tex
      do
      commande $i
      done

      for j in cat fichier/a.tex
      do
      commande $j
      done

      for k in cat fichier/a.tex
      do
      commande $k
      done


      mais c'est le plus simple pour moi.

      • [^] # Re: c'est simple...

        Posté par  . Évalué à 5.

        sans exemple de ce que contient la colonne difficile de répondre.

        Sinon j'ai une autre question, pourquoi le korn shell? et quelle version ? le ksh93 ? un plus récent ?

        Généralement, bash est plus communément connu.

        ensuite j'aurais tendance à dire que

        for i in $(cat fichier/a.tex) 
        do
        
        done

        risque de te péter un jour à la gueule pour cause de ligne trop longue.

        je te conseillerai plutôt un

        cat fichier/a.tex | while read i
        do
        
        done

        ou encore mieux, pour éviter un uuoc

        while read i
        do
        
        done < fichier/a.tex

        ensuite à supposer que ta colonne soit un certain nombre de valeurs séparées par un ';' tu peux utiliser la variable IFS

        while IFS=";" read i j k l reste
        do
         commande $i
         commande $j 
         commande $k
         commande $l
        done < fichier/a.tex

        Enfin si ton shell gère les $() ce qui devrait être le cas, il est très préférable de les utiliser à la places des backquotes (alt gr 7), c'est plus lisible, et tu peux les imbriquer sans jouer avec les \

        Ah et tant qu'a faire grep blablabla| awk, peut très probablement se remplacer par un seul awk :

        awk '/blabla/ {print $1}'

        Il ne faut pas décorner les boeufs avant d'avoir semé le vent

        • [^] # Re: c'est simple...

          Posté par  . Évalué à 1.


          ben voilà. c'est simple pour toi! Merci vieux !
          par contre pour le coup du awk me plait bien.
          c'est du ksh parce que c'est un vieux redhat (qui n'a que ce shell d'autorisé) en cluster (4 nodes) qui n'a pas de load balancer et donc qui met a disposition plus de 100 services clusters. Donc les services

          cat fichier/a.tex | echo while read -r a b c d;
          do
          commandeCluster $a node1;
          commandeCluster $b node2;
          commandeCluster $c node3;
          commandeCluster $d node4;
          done

          mais ça n'envoie pas les ressources en parallèle. Après sur le serveur on a un shell python, mais j'y connais rien au python.

          • [^] # Re: c'est simple...

            Posté par  . Évalué à 4.

            c'est difficile de répondre au besoin sans savoir le besoin, typiquement j'ai cru comprendre via ton commentaire que tu souhaiterais lancer les commandes en parallèle,

            donc si j'ai bien suivi tu as 4 machine sur lesquels envoyer les commandes avec 1 paramètre par ligne, et il faut découper le fichier de façon a exécuter les commandes sur les machines

            là dessus un solution basique consisterai a couper le ficher en 4
            typiquement

            split -l $(( $( wc -l ) / 4 + 1 )) fichier/a.tex

            et lancer tes boule en non bloquant

            while read a 
            do
              commande $a node1
            done < resultatDuSplit1 &
            
            while read a 
            do
              commande $a node2
            done < resultatDuSplit2 &
            
            ...

            Par contre si tes commandes ont un temps de traitement différent, tu peux souhaiter vouloir équilibrer le tout pour pas que le node1 prenne 15 heure alors que le node3 en utilise que 2. Là ça demande un peu plus technique et si c'est faisable à la main en shell, ça risque d'être marrant à maintenir pour le suivant

            par contre tu as un outils gnu pour ça : parallel

            par exemple :

            cat fichier/a.tex | parallel --sshlogin node1,node2,node3,node4 commande {}

            si tu n'as pas parallel, il existe aussi map

            Il ne faut pas décorner les boeufs avant d'avoir semé le vent

Suivre le flux des commentaires

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