• # vertical / horizontal

    Posté par  . Évalué à 1.

    Un truc que je n'ai jamais réussi à faire proprement avec les commandes de bases, c'est de transposer (lignes vers colonnes et colonnes vers lignes). Et je n'ai pas trouvé dans cette page comment faire.

    Le cas d'usage est simple: si je veux faire une manipulation sur des colonnes et pas sur des lignes (un grep ou un sed), alors je transpose, je grep ou sed, puis je re-transpose.

    #! /usr/bin/perl 
    # transpose
    use strict;
    my @full = ();
    my $max = 0;
    
    while (<STDIN>) {
        chomp;
        my @line = split(/[\s|\t]+/,$_);
        push @full, \@line;
        $max = scalar(@line) if ($max < scalar(@line));
    }
    
    for (my $i=0; $i < $max; $i++) {
        foreach (@full) {
        print @$_[$i]." ";
        }
        print "\n";
    }

    Ca fonctionne sur des tables non rectangulaires (jusqu'à un point qui me convient), et ça se pipe facilement.

    echo "a b c\nd e\n  f"
    a b c
    d e
        f
    
    echo "a b c\nd e\n  f" |t
    a d  
    b e f 
    c   
    
    echo "a b c\nd e\n  f" | t |t
    a b c 
    d e  
     f

    (ça compresse les espaces multiples)

    Bref, j'ai ça depuis 20 ans dans mes scripts que je trimballe d'une boîte à l'autre.

    Une idée pour faire ça avec le commandes courantes du shell ?

    • [^] # Re: vertical / horizontal

      Posté par  (site web personnel, Mastodon) . Évalué à 2.

      "chez moi"™ : malgré les deux espaces, le "f" n'est pas en troisième colonne…

      $ echo "a b c\nd e\n  f"
      a b c\nd e\n  f
      $ echo -e "a b c\nd e\n  f"
      a b c
      d e
        f
      $ printf '%s\n' "a b c\nd e\n  f"
      a b c\nd e\n  f
      $ printf '%b\n' "a b c\nd e\n  f"
      a b c
      d e
        f

      Je ne sais pas s'il y a une solution universelle et native à la transposition… Si tu veux vraiment un binaire, j'avais trouvé ce transpose en C sympa (mais il est vrai que pour cet usage simple, awk ou perl fait très bien l'affaire, si on s'y connait.) Il y également ce transpose en Python qui semble pas mal (ça fait déjà plus de choses…)
      À une époque où j'avais souvent besoin de ce genre de chose et ne travaillant que sur mon poste, je m'en remettais à Vim !

      “It is seldom that liberty of any kind is lost all at once.” ― David Hume

      • [^] # Re: vertical / horizontal

        Posté par  . Évalué à 1.

        "chez moi"™ : malgré les deux espaces, le "f" n'est pas en troisième colonne…

        C'est mon script qui compresse les espaces (le double pipe | t | t)

        je m'en remettais à Vim !

        oui, mais ça ne se pipe pas.

        Je note le transpose en Python, il y a beaucoup plus de possibilités.

        • [^] # Re: vertical / horizontal

          Posté par  (site web personnel, Mastodon) . Évalué à 2. Dernière modification le 25 novembre 2022 à 16:54.

          Oui, j'ai bien lu que t'as bien marqué

          (ça compresse les espaces multiples)

          Je faisais allusion au résultat de ton premier écho, avant tout passage par t, qui aligne le "f" sous le "c" ;-)

          PS. Vim se pipe… mais en bout de chaîne en général. Mais t'as raison parce-que son usage comme filtre est pénible d'une part, et mon besoin était pour des fichiers de documentation et non des scripts d'autre part.

          “It is seldom that liberty of any kind is lost all at once.” ― David Hume

        • [^] # Re: vertical / horizontal

          Posté par  (site web personnel, Mastodon) . Évalué à 2.

          je m'en remettais à Vim !

          oui, mais ça ne se pipe pas.

          Je ne l’ai pas testé, mais c’est apparemment exactement ce que fait la commande vipe de la suite d’outils moreutils.

Suivre le flux des commentaires

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