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行で印刷します
<column-number> <value>
。 - ソート基準値((GNU拡張)は、asが1を理解していない
g
のではなく)10進数が認識されることを保証します。n
n
+
LC_ALL=C
.
- 列番号と値があります。ただし、テーブルを再構築するために、ここでは元の数値を計算し、同じ列番号が表示されるたびにそれを増やします。
- 私たちは生に基づいてソートし、次にcolでソートするために再びsortを呼び出します
-s
。安定また、GNU拡張) - これを処理して列
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
この番号はデフォルトでサポートされています。.
ユーザーのロケールに関係なく、小数点以下の桁数のみが考慮されます。- ソートテーブルとストアテーブルが組み込まれている構造(GNU
awk
もこれを行うことができます)
これは、入力全体をメモリにロードする必要があることを意味します。
<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)
}
}'
-n
1 For、または(オプションの先行スペースを含む)形式の数字のみが認識されます。キー値を取得するには、文字列の先頭からパターンに一致する部分を取得します。したがって、の場合は空の文字列です。 GNUでは、これらすべての数字を認識できます。123
1.12
-12
-12.34
sort
12e+3
12
+12.3
0
-g
sort
+12
12e+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