/ / Zoradiť podľa najvyššej hodnoty v ľubovoľnom poli - bash, triedenie, awk

Zoradiť podľa najvyššej hodnoty v ľubovoľnom poli - bash, triedenie, awk

Chcem zoradiť súbor založený na hodnotách v stĺpcoch2-8? V podstate chcem vzostupný poriadok založený na najvyššej hodnote, ktorá sa zobrazuje na riadku v ktorejkoľvek z týchto polí, ale ignorujú stĺpce 1, 9 a 10. tj riadok s najvyššou hodnotou by mal byť posledný riadok súboru, druhá najväčšia hodnota by mala byť 2. posledný riadok atď ... Ak sa nasledujúce číslo vo vzostupnom poradí objaví na viacerých riadkoch (ako A / B), nedbá to na to, aby sa vytlačil.

Pozrel som sa na používanie druh ale nemôžem zistiť jednoduchý spôsob, ako urobiť to, čo chcem ...

Som trochu zakončený, nejaké nápady?

vstup:

#1     2     3     4     5     6     7     8     9    10
A  0.00  0.00  0.01  0.23  0.19  0.07  0.26  0.52  0.78
B  0.00  0.00  0.02  0.26  0.19  0.09  0.20  0.56  0.76
C  0.00  0.00  0.02  0.16  0.20  0.22  2.84  0.60  3.44
D  0.00  0.00  0.02  0.29  0.22  0.09  0.28  0.62  0.90
E  0.00  0.00  0.90  0.09  0.18  0.05  0.24  1.21  1.46
F  0.00  0.00  1.06  0.03  0.04  0.01  0.00  1.13  1.14
G  0.00  0.00  1.11  0.10  0.31  0.08  0.64  1.60  2.25
H  0.00  0.00  1.39  0.03  0.04  0.01  0.01  1.47  1.48
I  0.00  0.00  1.68  0.16  0.55  0.24  5.00  2.63  7.63
J  0.00  0.00  6.86  0.52  1.87  0.59 12.79  9.83 22.62
K  0.00  0.00  7.26  0.57  2.00  0.64 11.12 10.47 21.59

Očakávaný výkon:

#1     2     3     4     5     6     7     8     9    10
A  0.00  0.00  0.01  0.23  0.19  0.07  (0.26)  0.52  0.78
B  0.00  0.00  0.02  (0.26)  0.19  0.09  0.20  0.56  0.76
D  0.00  0.00  0.02  (0.29)  0.22  0.09  0.28  0.62  0.90
E  0.00  0.00  (0.90)  0.09  0.18  0.05  0.24  1.21  1.46
F  0.00  0.00  (1.06)  0.03  0.04  0.01  0.00  1.13  1.14
G  0.00  0.00  (1.11)  0.10  0.31  0.08  0.64  1.60  2.25
H  0.00  0.00  (1.39)  0.03  0.04  0.01  0.01  1.47  1.48
C  0.00  0.00  0.02  0.16  0.20  0.22  (2.84)  0.60  3.44
I  0.00  0.00  1.68  0.16  0.55  0.24  (5.00)  2.63  7.63
K  0.00  0.00  7.26  0.57  2.00  0.64 (11.12) 10.47 21.59
J  0.00  0.00  6.86  0.52  1.87  0.59 (12.79)  9.83 22.62

odpovede:

5 pre odpoveď č. 1

Predbežne spracujte údaje: vytlačte maximálny počet stĺpcov 2 až 8 na začiatku každého riadku, potom triedite a potom odstráňte pridaný stĺpec:

awk "
NR==1{print "x ", $0}
NR>1{
max = $2;
for( i = 3; i <= 8; i++ )
if( $i > max )
max = $i;
print max, $0
}" OFS=\t input-file | sort -n | cut -f 2-

3 pre odpoveď č. 2

Ďalší čistý awk varianta:

$ awk "NR==1; # print header

NR>1{ #For other lines,
a=$2;
ai=2;
for(i=3;i<=8;i++){
if($i>a){
a=$i;
ai=i;
}
} # Find the max number in the line

$ai= "(" $ai ")"; # decoration - mark highest with ()
g[$0]=a;
}

function cmp_num_val(i1, v1, i2, v2) {return (v1 - v2);} # sorting function

END{
PROCINFO["sorted_in"]="cmp_num_val"; # assign sorting function
for (a in g) print a; # print
}" sortme.txt | column -t # column -t for formatting.

#1  2     3     4       5       6     7     8        9      10
A   0.00  0.00  0.01    0.23    0.19  0.07  (0.26)   0.52   0.78
B   0.00  0.00  0.02    (0.26)  0.19  0.09  0.20     0.56   0.76
D   0.00  0.00  0.02    (0.29)  0.22  0.09  0.28     0.62   0.90
E   0.00  0.00  (0.90)  0.09    0.18  0.05  0.24     1.21   1.46
F   0.00  0.00  (1.06)  0.03    0.04  0.01  0.00     1.13   1.14
G   0.00  0.00  (1.11)  0.10    0.31  0.08  0.64     1.60   2.25
H   0.00  0.00  (1.39)  0.03    0.04  0.01  0.01     1.47   1.48
C   0.00  0.00  0.02    0.16    0.20  0.22  (2.84)   0.60   3.44
I   0.00  0.00  1.68    0.16    0.55  0.24  (5.00)   2.63   7.63
K   0.00  0.00  7.26    0.57    2.00  0.64  (11.12)  10.47  21.59
J   0.00  0.00  6.86    0.52    1.87  0.59  (12.79)  9.83   22.62