多数の列を並べ替える方法は?

多数の列を並べ替える方法は?

私は多数の列を並べ替えるためのパイプライン可能な限り行のコードを探しています(たとえば、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

おすすめ記事