縦ではなく横に並べる必要がありますが、縦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
awk
GNUを使用すると、内部設定で配列が移動される順序を指定できます。この場合、値の昇順で配列を強制的に巡回するように設定します。sorted_in
PROCINFO
@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でソートされたリストのインデックスを返す方法は?
リストを使用した行の分割
だから
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
使用牛に似た一種の栄養
datamash
、変える、ソート、変える再:datamash -t '/' transpose < file | datamash -t '/' -s -g1 transpose
出力:
apple/banana/mango/orange onion/potato/garlic/tomato carpet/chair/window/table
様々な種類ソフトウェアツール:
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
仕組み:
join
optionsに渡された引数を使用して列の順序を変更できます-o
。したがって、(変数と配列を使用せずに)次のパラメータを生成することはコツです。head
最初の行を取得し、tr
複数行に変換し、- 任意の
nl
数字、 sort
2番目の列(例:りんご、等。 )、cut
列1の並べ替えられた数値のリスト、sed
join
数値を目的の形式に変換します。