私は多数の列を並べ替えるためのパイプライン可能な限り行のコードを探しています(たとえば、awk
このようなコマンドで列番号を手動で入力することはawk '{print $3,$2,$1}'
不可能です)。順序は、ソート方式(文字、数字 - 「ソート」と似ていますが、行ではなく列に対応します)を使用するか、テキストファイルで任意に指定できます。
ベストアンサー1
Perlを使ったシンプルなソリューション。
値の配列を埋めることから始めます。
➜ ~ x="$(cat << END
22 79 83 16 25 1 4 82 34 68
48 43 2 26 39 2 71 43 57 41
77 70 73 18 76 33 21 54 67 50
6 65 46 92 25 70 53 28 3 40
32 60 76 39 26 44 34 91 24 39
59 75 96 85 52 98 69 28 72 94
48 0 88 55 6 78 1 54 83 81
3 43 48 24 23 87 28 98 38 67
97 73 74 24 92 67 1 27 90 85
32 55 52 44 26 37 87 37 100 92
END
)"
➜ ~ perl -lane '@i=sort({ @F[$a] <=> @F[$b] } 0..$#F) if $.==1;
print join("\t", @F[@i])' <<< "$x"
1 4 16 22 25 34 68 79 82 83
2 71 26 48 39 57 41 43 43 2
33 21 18 77 76 67 50 70 54 73
70 53 92 6 25 3 40 65 28 46
44 34 39 32 26 24 39 60 91 76
98 69 85 59 52 72 94 75 28 96
78 1 55 48 6 83 81 0 54 88
87 28 24 3 23 38 67 43 98 48
67 1 24 97 92 90 85 73 27 74
37 87 44 32 26 100 92 55 37 52
-a
@F
: 配列の自動分割と自動塗りつぶしの有効化-n
:while ループの各行を読み込みます。$#F
: 配列内の最大のゼロベースのインデックスを返します。<=>
:ソート機能の比較演算子(数値入力のみ可能、文字列比較に使用cmp
)sort
:配列内のソートされたインデックスを返します0..$#F
(組み込み$a
合計$b
変数を使用)。@i
@F
:(この場合)を含むソートされた@i = 5 6 3 0 4 8 9 1 7 2
インデックス配列$. == 1
:最初の行でのみ実行されます。@F[@i]
:ソートされたインデックスに従って各行をソートします。
源泉:https://learnbyexample.gitbooks.io/command-line-text-processing/content/perl_the_swiss_knife.html