複数の列を数字で並べ替える

複数の列を数字で並べ替える

600列のファイルを並べ替えようとしています。上部に最も高い数字をすべて表示したい(各フィールドの降順)。スペースで区切られたファイルを分割して、正しく機能していることを確認します。このコマンドを試しましたが、何かが間違っているようです。

$ cat test.txt
+0.07273 +0.67860
-6.99580 -0.44278 
-7.21295 +0.19793

$ sort -nr test.txt # (just sorted column one)
-7.21295 +0.19793
-6.99580 -0.44278 
+0.07273 +0.67860

$ sort -k1,1nr -k2,2nr test.txt # (just sorted column one)
+0.0727  +0.67860
-6.99580 -0.44278 
-7.21295 +0.19793

列全体を降順に並べ替えるにはどうすればよいですか? kを600回使用するのは難しい

答え1

次のことができます。

<test.txt awk '{for (c = 1; c<=NF; c++) print c, $c}' |
  LC_ALL=C sort -k2,2rg |
  awk '{print $1, r[$1]++, $2}' |
  sort -sk2,2n -k1,1n | awk '
    {printf "%s", ($2 == prev ? (NR == 1 ? "" : " ") : "\n") $3; prev = $2}
    END {print ""}'

それは:

  1. 各セルを1行で印刷します<column-number> <value>
  2. ソート基準((GNU拡張)は、asが1を理解していないgのではなく)10進数が認識されることを保証します。nn+LC_ALL=C.
  3. 列番号と値があります。ただし、テーブルを再構築するために、ここでは元の数値を計算し、同じ列番号が表示されるたびにそれを増やします。
  4. 私たちは生に基づいてソートし、次にcolでソートするために再びsortを呼び出します-s安定また、GNU拡張)
  5. これを処理して列awkごとに印刷します。

入力内容に基づいて、最後のステップの直前に以下が提供されます。

1 0 +0.07273
2 0 +0.67860
1 1 -6.99580
2 1 +0.19793
1 2 -7.21295
2 2 -0.44278

これはawk次のとおりです。

+0.07273 +0.67860
-6.99580 +0.19793
-7.21295 -0.44278

各列は、数値に応じて最大値から最小値までソートされます。

perlこれでどちらがより使いやすいかがわかります。

  • +1.123この番号はデフォルトでサポートされています。
  • .ユーザーのロケールに関係なく、小数点以下の桁数のみが考慮されます。
  • ソートテーブルとストアテーブルが組み込まれている構造(GNUawkもこれを行うことができます)

これは、入力全体をメモリにロードする必要があることを意味します。

<test.txt perl -lane '
   my $n; push @{$c[$n++]}, $_ for @F;
   END {
     @{$_} = sort {$b <=> $a} @{$_} for @c; # sort the columns in 
                                            # reverse-numerical order
     for ($r = 0; $r < $.; $r++) {
       print join " ", map {$c[$_]->[$r]} (0..$#c)
     }
   }'

-n1 For、または(オプションの先行スペースを含む)形式の数字のみが認識されます。キー値を取得するには、文字列の先頭からパターンに一致する部分を取得します。したがって、の場合は空の文字列です。 GNUでは、これらすべての数字を認識できます。1231.12-12-12.34sort12e+312+12.30-gsort+1212e+3

$ printf '%s\n' 1 2 10 2e3 +2 +10 inf +1 | sort -n
+1
+10
+2
inf
1
2
2e3
10
$ printf '%s\n' 1 2 10 2e3 +2 +10 inf +1 | sort -g
1
+1
2
+2
10
+10
2e3
inf

関連情報