Forum Programmation.shell Une aide, svp

Posté par  .
Étiquettes : aucune
0
3
nov.
2005

bonjour,

j'ai un probleme avec linux (l'editeur VI plutot). J'ai un fichier qui contient que des lignes (une seule colonne). Chaque ligne contient un chiffre, pr ex:

1

3

56

21

25

64

23

Je veux maintenant changer ces lignes en des conlonnes, par ex:

1 3 56 21 25 64 23

comment peux-je faire, s-v-p? Merci bc

  • # "J"

    Posté par  . Évalué à 6.

    Tu passes en mode commande (touche esc), tu te places sur la première ligne, et tu restes appuyé sur la touche J de ton clavier.
    Ca permet de joindre les lignes.
    Si tu as la flemme de rester appuyé sur la touche 'j' de ton clavier, tu fais la séquence suivante en mode commande : ":%j" pour joindre toutes les lignes, du début à la fin. Sinon, si tu ne veux faire cette opération que de la ligne 17 à la ligne 42 ":17,42j"
    A noter également que la commande j insère un espace entre la fin de la ligne courante et le début de la ligne suivante, à l'endroit de la jointure :
    1
    2
    devient
    1 2
    alors que j! ne le fait pas :
    1
    2
    devient
    12
    Voilà, en espérant que ça répond à ta question.
    • [^] # Re: "J"

      Posté par  . Évalué à 1.

      Merci bcp, j'ai reussi avec ton aide
    • [^] # Re: "J"

      Posté par  . Évalué à 1.

      Salut,
      Je suis désolé de te déranger encore une fois. On peut exécuter la technique que tu me montre quand on est dans VI, le problème ici c'est que je suis dans le "terminal" de linux et j'ai plusieurs fichiers à changer des lignes en colonnes, je ne peux pas entrer plusieurs fois dans le VI parce que ça coût bcp de temps, tu as une autre manière?
      • [^] # Re: "J"

        Posté par  . Évalué à 3.

        Voir le tr ci-dessous par exemple.
  • # tr

    Posté par  . Évalué à 2.

    cat test | tr \\n ' '

    man tr http://unixhelp.ed.ac.uk/CGI/man-cgi?tr+1
    • [^] # Re: tr

      Posté par  . Évalué à 2.

      tr \\n test

      CAT SERT A CONCATENER DES FICHIERS ET UN CAT | AUTRE_COMMANDE NE SERT A RIEN
      • [^] # Re: tr

        Posté par  . Évalué à 2.

        sauf si AUTRE_COMMANDE ne prend pas de fichiers en parametres et préfère lire directement les données sur son entrée standard

        Cela permet parfois aussi de ne pas lire le man d'une commande, pour trouver quelle est l'option pour lui passer un nom de fichier en parametre.
        • [^] # Re: tr

          Posté par  . Évalué à 2.

          Ce qui est le cas de tr :-)

          plus d'info sur le post ci-dessous.
        • [^] # Re: tr

          Posté par  . Évalué à 4.

          t'en connais beaucoup des comme ca? Parce que j'ai pas souvenir d'en avoir rencontré.
          Cela permet parfois aussi de ne pas lire le man d'une commande, pour trouver quelle est l'option pour lui passer un nom de fichier en parametre.
          ... Ce qui est completement idiot.

          les commandes en général prennent le nom de fichier sans option particuliere, et si une commande prend les données sur l'entrée standard, commande <fichier doit suffire.

          Par contre il faut penser qu'un cat|commande te fait effectuer un fork+exe ce qui prend du temps, non négligeable si tu dois faire ca dans une boucle a parcourir 1 million de fois.
          • [^] # Re: tr

            Posté par  . Évalué à 1.

            > t'en connais beaucoup des comme ca? Parce que j'ai pas souvenir
            > d'en avoir rencontré.

            Bah oui, par exemple un script perl (ou autre) à deux balles qui se contente de lire dans stdin, et pour lequel t'as pas envie de coder de paramètres.
            • [^] # Re: tr

              Posté par  . Évalué à 3.

              Tout script perl "à deux balles" codé pour lire dans stdin peut aussi traiter une liste de fichiers passée en argument. Tu peux donc remplacer
              cat f1 f2 f3 | script_perl_a_deux_balles.pl
              par
              script_perl_a_deux_balles.pl f1 f2 f3

              Cf la page man perlop:
              Le filehandle vide <> est spécial et peut être utiliser pour émuler le
              comportement de sed et de awk. L'entrée de <> provient soit de l'entrée
              standard soit de tous les fichiers listés sur la ligne de commande.
              Voici comment ça marche : la première fois que <> est évalué, on teste
              le tableau @ARGV et s'il est vide alors $ARGV[0] est positionné à "-"
              qui lorsqu'il sera ouvert lira l'entrée standard. Puis le tableau @ARGV
              est traité comme une liste de nom de fichiers.
    • [^] # Re: tr

      Posté par  . Évalué à 2.

      Salut,
      Je suis nul en anglais. Peux-tu m'expliquer en francais? J'ai plusieurs fichier comme ca, je veux faire une compilation une seule fois pour obtenir des nouveaux fichiers qui contiennent que des colonnes. D'avance merci
      • [^] # Re: tr

        Posté par  . Évalué à 2.

        tr est une commande pour modifier un flux de donne
        donc tr \\n ' ' transforme le caractère \n (qui correspond à une fin de ligne) en un espace.

        la commande cat transmet un flux à l'utilitaire tr correspondant au fichier. tr fait ensuite la


        pour traiter un ensemble de fichier, c'est (en admettant que tes fichiers ont l'extension dat
        for i in *.dat; do
        cat "$i" | tr \\n ' ' > "$i.new"
        done;

        la fin ligne > "$i.new" stocke dans un fichier .new le résultat.

        va lire http://lea-linux.org/cached/index/Dev-shell_script.html pour un cours plus complet.

        Bonne continuation


        PS : Pour totof2000
        # tr --help
        Usage: tr [OPTION]... ENSEMBLE1 [ENSEMBLE2]
        Translate, squeeze, and/or delete characters from standard input,
        writing to standard output.
        ...
        Rapporter toutes anomalies à <bug-coreutils@gnu.org>.

        donc il faut utiliser cat, j'attends des excuses :-)
        • [^] # Re: tr

          Posté par  . Évalué à 3.

          tr tr \\n ' ' <fichier.
          Non tu n'auras pas d'excuses :)
          • [^] # Re: tr

            Posté par  . Évalué à 3.

            Alle, une demi-excuse parce que effectivement il faut le < devant le fichier pour la redirection.
            • [^] # Re: tr

              Posté par  . Évalué à 2.

              Bien, ca me va - à moitié - et sans rancune :-D
        • [^] # Re: tr

          Posté par  . Évalué à 2.

          merci beaucoup, j'ai bien compris ce que tu as indiqué. Bonne fin de la journée

Suivre le flux des commentaires

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