/ / Sortuj według najwyższej wartości w dowolnym polu - bash, sortowanie, awk

Sortuj według najwyższej wartości w dowolnym polu - bash, sortowanie, awk

Chcę posortować plik na podstawie wartości w kolumnach2-8? Zasadniczo chcę kolejność rosnącą w oparciu o najwyższą wartość, która pojawia się w linii w którymkolwiek z tych pól, ale ignorując kolumny 1, 9 i 10. tzn. Linia o najwyższej wartości powinna być ostatnią linią pliku, drugą największą wartością powinna być Druga ostatnia linia itp. ... Jeśli kolejna liczba w kolejności rosnącej pojawia się na wielu liniach (np. A / B), nie dbam o kolejność, w jakiej zostanie wydrukowana.

Spojrzałem na używanie sortować ale nie mogę znaleźć łatwego sposobu na zrobienie tego, co chcę ...

„Jestem trochę zakłopotany, jakieś pomysły?

Wkład:

#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

Oczekiwany wynik:

#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

Odpowiedzi:

5 dla odpowiedzi № 1

Przetwarzaj wstępnie dane: wydrukuj maksymalną liczbę kolumn od 2 do 8 na początku każdej linii, a następnie posortuj, a następnie usuń dodaną kolumnę:

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 dla odpowiedzi № 2

Kolejny czysty awk wariant:

$ 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