特定の行の列に基づいてすべての行を水平に並べ替えます。

特定の行の列に基づいてすべての行を水平に並べ替えます。

縦ではなく横に並べる必要がありますが、縦sort作業用に設計されたようです。たとえば、次の3つの行があります。

banana/orange/apple/mango
potato/tomato/onion/garlic
chair/table/carpet/window

すべての行は同じ数の列を持ち、で区切ります/。最初の行の列をアルファベット順に並べ替えたいです。だからそれは次のようになります:

apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table

これは次のようによりよく視覚化できます。

カラーバーのテキスト

つまり、スプレッドシートの列に基づいて並べ替えるのと同じです。

答え1

awkGNUを使用すると、内部設定で配列が移動される順序を指定できます。この場合、値の昇順で配列を強制的に巡回するように設定します。sorted_inPROCINFO@val_str_asc

次に、最初の行を配列に分割しa 、最後に各行に対して配列を繰り返し、検索時にキーに対応するフィールドを印刷します。

awk -F'/' 'BEGIN{PROCINFO["sorted_in"]="@val_str_asc"};
   FNR == 1{n = split($0, a)};
   {x=0; for (k in a) printf "%s%s", $k, ++x == n? "\n": FS}' file

apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table

またはpython

from __future__ import print_function
with open('file') as f:
    keys = next(f).rstrip('\n').split('/')
    print(*sorted(keys), sep='/')
    for line in f:
            g = (m for l, m in sorted(zip(keys, line.rstrip('\n').split('/'))))
            print(*g, sep='/')

apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table

答え2

私が考える基本的なアプローチは

だから

perl -F'/' -alne '
   our @inds = sort { $F[$a] cmp $F[$b] } 0..$#F if $. == 1; 
   print join "/", @F[@inds]
' file

答え3

BSDへrsユーティリティ:

$ rs -T -c'/' <data.in | sort | rs -T -C'/' >data.out
  • -T変える
  • -c'/'入力列区切り記号の設定
  • -C'/'出力列区切り記号の設定

それを見てください:

$ cat data.in
banana/orange/apple/mango
potato/tomato/onion/garlic
chair/table/carpet/window

$ cat data.out
apple/banana/mango/orange/
onion/potato/garlic/tomato/
carpet/chair/window/table/

/最後の追加ビットを削除します。

$ sed 's#/$##' data.out
apple/banana/mango/orange
onion/potato/garlic/tomato
carpet/chair/window/table

答え4

  1. 使用牛に似た一種の栄養datamash変える、ソート、変える再:

    datamash -t '/' transpose < file | datamash -t '/' -s -g1 transpose
    

    出力:

    apple/banana/mango/orange
    onion/potato/garlic/tomato
    carpet/chair/window/table
    
  2. 様々な種類ソフトウェアツール:

    join -a 1 -t / -o $( head -n 1 file | \
                         tr / '\n' | \ 
                         nl  -n ln | \
                         sort  -k2 | \
                         cut   -f1 | \
                         sed -n 's/^/1./;H;1h;${x;s/\n/,/g;s/ //gp}' ) \
          file /dev/null
    

    仕組み:joinoptionsに渡された引数を使用して列の順序を変更できます-o。したがって、(変数と配列を使用せずに)次のパラメータを生成することはコツです。

    1. head最初の行を取得し、
    2. tr複数行に変換し、
    3. 任意のnl数字、
    4. sort2番目の列(例:りんご、等。 )、
    5. cut列1の並べ替えられた数値のリスト、
    6. sedjoin数値を目的の形式に変換します。

関連情報