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  (Mastodon) . É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.

  • # Commentaire supprimé

    Posté par  . Évalué à 5.

    Ce commentaire a été supprimé par l’équipe de modération.

  • # Quelques lignes de commandes en bash

    Posté par  . Évalué à 0. Dernière modification le 28 janvier 2020 à 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

    … et dans ce royaume, ceux qui y voient un peu plus clair sont parfois très mal vus.

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

      Posté par  . Évalué à 1. Dernière modification le 28 janvier 2020 à 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

      … et dans ce royaume, ceux qui y voient un peu plus clair sont parfois très mal vus.

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

        Posté par  (Mastodon) . É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 ?

          Matricule 23415

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

          Posté par  . Évalué à 2. Dernière modification le 28 janvier 2020 à 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<&-

          … et dans ce royaume, ceux qui y voient un peu plus clair sont parfois très mal vus.

          • [^] # 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 janvier 2020 à 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<&-

              … et dans ce royaume, ceux qui y voient un peu plus clair sont parfois très mal vus.

              • [^] # 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

                … et dans ce royaume, ceux qui y voient un peu plus clair sont parfois très mal vus.

  • # lam sur unix ou nl + join sur linux

    Posté par  . Évalué à 1. Dernière modification le 14 février 2020 à 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 à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.