Transponieren Sie eine Matrix mit sed

  • Ich versuche folgende Daten zu transponieren:

     1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
    1 2 3 4 5 6 7 8 9 10
     

    nach :

     1 1 1 1 1 1 1 1 1 1
    2 2 2 2 2 2 2 2 2 2
    3 3 3 3 3 3 3 3 3 3
    4 4 4 4 4 4 4 4 4 4
    5 5 5 5 5 5 5 5 5 5
    6 6 6 6 6 6 6 6 6 6
    7 7 7 7 7 7 7 7 7 7
    8 8 8 8 8 8 8 8 8 8
    9 9 9 9 9 9 9 9 9 9
    10 10 10 10 10 10 10 10 10 10
     

    Bitte nur mit sed.

    Ich habe eine funktionierende Lösung, aber ich bin sicher, dass sie verbessert werden kann:

     sed -rn 'H;${x;s/\n/ &/g;s/$/@/;:a;s/\n([^ ]+ ?)(.*@.*)/%\2\1/;ta;s/ %+@//p;t;s/ *$/\n/;y/%/\n/;ta}'
     

    Es verwendet % und @ für Trennzeichen für Zeilenumbrüche und Zeichenfolgen, die problematisch sein können.

    26 January 2015
    Jamal
1 answer
  • Dies ist noch eine weitere Möglichkeit:

     sed -r '1{s/$/ /;s/ / \n/g};:a;$!N;s/$/ /;:b;s/\n(.*\n+)(\S+\s)/\2@!@\1/;tb;s/@!@/\n/g;${s/ \n/\n/g;s/\n+$//;q};ba'
     

    Diese Methode ist etwas schneller und nur etwas verwendet ein einzelnes Trennzeichen, das möglicherweise einzigartig ist. d. h. @!@ in diesem Beispiel

    24 November 2011
    mdb