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

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

縦ではなく横に並べる必要がありますが、縦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

おすすめ記事