Forum Programmation.shell alternative de la commande paste

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
28
jan.
2020

Bonjour

je veux ajouter le contenu d'un fichier dans un autre voilà le contenu de mes fichiers par titre d'exemple :

monfichier1=

1   Germany
2   Indonesia
3   United Kingdom
4   Malaysia

monfichier2=

Ping: 15 ms
Ping: 29 ms
Ping: 31 ms
Ping: 29 ms

mon but c'est d'avoir un autre fichier 3 comme ça :

1  Germany           Ping: 15 ms
2  Indonesia         Ping: 29 ms
3  United Kingdom    Ping: 31 ms
4  Malaysia          Ping: 29 ms

avec cete commande les resultats ne son pa a linear

1 Germany Ping: 15 ms
2 Indonesia Ping: 29 ms
3 United Kingdom Ping: 31 ms

Titre de l'image
ce que je veux:

Titre de l'image
while read -u 3 a && read -u 4 b; do echo $a $b >>monfichier3 ; done 3<monfichier1 4<monfichier2

s´il vous plait, je ne veux pas la commande #paste
car mon system ne le permet pas

  • # printf

    Posté par  . Évalué à 4.

    Peut-être que en utilisant printf au lieu de echo ?

    Avec printf tu peux préciser le nombre de caractères voulus, il complètera par des blancs si nécessaire.

    Un exemple

    En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

  • # column

    Posté par  . Évalué à 5.

    Probablement en pipant le merge dans la commande column.
    (quoi ? Du frangilche ? Bah ouais !)

  • # Quelques lignes de commandes en bash

    Posté par  . Évalué à 0. Dernière modification le 28/01/20 à 13:28.

    # Trouver la longueur de la ligne la plus longue dans monfichier1
    longMax=0; while read ligne; do [ ${#ligne} -gt $longMax ] && longMax=${#ligne}; done < monfichier1
    
    # Mettre toutes les lignes du monfichier à la même longueur
    > monfichierTmp; while read ligne; do printf "%-"$longMax"s\t\n" "$ligne" >> monfichierTmp; done < monfichier1
    cat monfichierTmp > monfichier1 && rm monfichierTmp
    
    # Ajouter ligne à ligne le contenu de monfichier2 à monfichier1
    paste monfichier1 monfichier2 > monfichierTmp
    cat monfichierTmp > monfichier1 && rm monfichierTmp
    • [^] # Re: Quelques lignes de commandes en bash

      Posté par  . Évalué à 1. Dernière modification le 28/01/20 à 13:42.

      La dernière ligne de commande n'était pas nécessaire,
      et le caractère de tabulation était de trop dans le printf

      donc :

      # Trouver la longueur de la ligne la plus longue dans monfichier1
      longMax=0; while read ligne; do [ ${#ligne} -gt $longMax ] && longMax=${#ligne}; done < monfichier1
      
      # Mettre toutes les lignes du monfichier1 à la même longueur
      > monfichierTmp; while read ligne; do printf "%-"$longMax"s\n" "$ligne" >> monfichierTmp; done < monfichier1
      cat monfichierTmp > monfichier1 && rm monfichierTmp
      
      # Ajouter ligne à ligne le contenu de monfichier2 à monfichier1
      paste monfichier1 monfichier2 > monfichier1
      • [^] # Re: Quelques lignes de commandes en bash

        Posté par  . Évalué à 2.

        L'auteur du journal précise qu'il ne faut pas utiliser paste.

        En théorie, la théorie et la pratique c'est pareil. En pratique c'est pas vrai.

        • [^] # Re: Quelques lignes de commandes en bash

          Posté par  . Évalué à 2.

          Certes, mais du coup on a le droit à quoi ?

        • [^] # Re: Quelques lignes de commandes en bash

          Posté par  . Évalué à 2. Dernière modification le 28/01/20 à 14:33.

          L'auteur du journal précise qu'il ne faut pas utiliser paste.

          Ooops désolé

          Alors, avec ça :

          #!/bin/bash
          
          longMax=0
          while read ligne; do
              [ ${#ligne} -gt $longMax ] && longMax=${#ligne}
          done <monfichier1
          
          exec 6<monfichier2
          while read ligne1; do
              read ligne2 <&6
              printf "%-"$longMax"s\t%s\n" "$ligne1" "$ligne2"
          done <monfichier1
          exec 6<&-
          • [^] # Re: Quelques lignes de commandes en bash

            Posté par  . Évalué à -5.

            merci beaucoup pour votre aide
            j'ai ajouté deux autres fichiers malheureusement je dois executer les commandes 3 fois pour obtenir le résultat que je cherche

            longMax=0
            while read ligne; do
            [ ${#ligne} -gt {mathjax} longMax ] && longMax={#ligne}
            done <$FreeServertmpa77

            exec 6<$FreeServertmpb84
            while read ligne1; do
            read ligne2 <&6
            printf "%-"$longMax"s\t%s\n" "$ligne1" "$ligne2"
            done <$FreeServertmpa77 > $FreeServertmpa90
            exec 6<&-

            longMax=0
            while read ligne; do
            [ ${#ligne} -gt {mathjax} longMax ] && longMax={#ligne}
            done <$FreeServertmpa90

            exec 6<$FreeServertmpb76
            while read ligne1; do
            read ligne2 <&6
            printf "%-"$longMax"s\t%s\n" "$ligne1" "$ligne2"
            done <$FreeServertmpa90 > $FreeServertmpa91
            exec 6<&-

            longMax=0
            while read ligne; do
            [ ${#ligne} -gt {mathjax} longMax ] && longMax={#ligne}
            done <$FreeServertmpb77

            exec 6<$FreeServertmpa91
            while read ligne1; do
            read ligne2 <&6
            printf "%-"$longMax"s\t%s\n" "$ligne1" "$ligne2"
            done <$FreeServertmpb77 > $FreeServertmpe79
            exec 6<&-

          • [^] # Re: Quelques lignes de commandes en bash

            Posté par  . Évalué à -5.

            merci ..par contre je dois executer 3 fois la commande pour ajouter deux fichiers supplémentaires

            longMax=0
            while read ligne; do
            [ ${#ligne} -gt {mathjax} longMax ] && longMax={#ligne}
            done <$FreeServertmpa77

            exec 6<$FreeServertmpb84
            while read ligne1; do
            read ligne2 <&6
            printf "%-"$longMax"s\t%s\n" "$ligne1" "$ligne2"
            done <$FreeServertmpa77 > $FreeServertmpa90
            exec 6<&-

            longMax=0
            while read ligne; do
            [ ${#ligne} -gt {mathjax} longMax ] && longMax={#ligne}
            done <$FreeServertmpa90

            exec 6<$FreeServertmpb76
            while read ligne1; do
            read ligne2 <&6
            printf "%-"$longMax"s\t%s\n" "$ligne1" "$ligne2"
            done <$FreeServertmpa90 > $FreeServertmpa91
            exec 6<&-

            longMax=0
            while read ligne; do
            [ ${#ligne} -gt {mathjax} longMax ] && longMax={#ligne}
            done <$FreeServertmpb77

            exec 6<$FreeServertmpa91
            while read ligne1; do
            read ligne2 <&6
            printf "%-"$longMax"s\t%s\n" "$ligne1" "$ligne2"
            done <$FreeServertmpb77 > $FreeServertmpe79
            exec 6<&-

            • [^] # Re: Quelques lignes de commandes en bash

              Posté par  . Évalué à 1. Dernière modification le 29/01/20 à 08:53.

              Ou alors, avec ce qui suit

              #!/bin/bash
              
              # Juste pour garder les noms des variables que vous aviez utilisés
              fichier1=$FreeServertmpa76
              fichier2=$FreeServertmpa77
              fichier3=$FreeServertmpa84
              
              fich_Out=$FreeServertmpe79
              
              longMax1=0
              while read ligne; do
                  [ ${#ligne} -gt $longMax1 ] && longMax1=${#ligne}
              done <$fichier1
              
              longMax2=0
              while read ligne; do
                  [ ${#ligne} -gt $longMax2 ] && longMax2=${#ligne}
              done <$fichier2
              
              exec 6<$fichier2
              exec 7<$fichier3
              while read ligne1; do
                  read ligne2 <&6
                  read ligne3 <&7
                  printf "%-"$longMax1"s\t%-"$longMax2"s\t%s\n" "$ligne1" "$ligne2" "$ligne3"
              done < $fichier1 > $fich_Out
              exec 6<&-
              exec 7<&-
              • [^] # Re: Quelques lignes de commandes en bash

                Posté par  . Évalué à 1.

                Ahhh zut!
                Une petite erreur sur les noms de variables que vous aviez utilisés :

                fichier1=$FreeServertmpb76
                fichier2=$FreeServertmpa77
                fichier3=$FreeServertmpb84
  • # lam sur unix ou nl + join sur linux

    Posté par  . Évalué à 1. Dernière modification le 14/02/20 à 20:38.

    Sur Unix, il existe la commande
    lam fichier1 fichier2 > fichier 3
    Sur linux :
    Numéroter le fichier2, puis faire un join sur les deux fichiers
    nl fichier2 > fichier2nl
    join fichier1 fichier2nl > fichier3
    rm fichier2nl

  • # sed + awk

    Posté par  . Évalué à 1.

    sed 'R fichier2' fichier1 | awk '(NR%2){printf("%-20s", $0)}(!(NR%2)){printf("%s\n", $0)}' > fichier3

    Mettre les bonnes quote pour que ça marche avec votre shell,
    Remplacer la valeur 20 par celle qui vous convient, ça fixe la longueur avant le mot Ping dans votre exemple.
    Explications :
    sed lit une ligne de fichier1 puis une ligne de fichier2, etc…
    awk : les lignes impaires (NR%2) : on imprime juste le contenu d'une ligne et pour les lignes paires on imprime le contenu de la ligne plus un saut de ligne.

    • [^] # Re: sed + awk

      Posté par  . Évalué à 1.

      Salut,

      Ou juste avec sed ;-)

      sed 'R f2' f1 | sed ':z;s/^.\{1,20\}$/& /;tz;N;s/\n/\t/'

Suivre le flux des commentaires

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