2017-02-15 16 views
0

Есть ли функция RANK в AWK, что значения RANK для одного столбца в одном текстовом файле (более высокое значение находится сверху)? Ожидая этого:Значения RANK на столбец с AWK

 
Original  Results 
A B C  Result_A Result_B Result_C 
8 5 4  1   2   1 
4 7 3  2   1   2 
2 3 4  3   3   1

Я использую этот скрипт AWK, но только содержит один столбец. Может ли кто-нибудь вести меня в правильном направлении? Очень ценится.

awk ' { 
if(val!=$2){ rank++; } 
printf("%s\t%s\t%s\n",rank,$1,$2) 
val=$2 
} ' <(sort -k2 -nr Original.txt) > Results.txt 
+0

почему 'Result_C' имеет порядок' 1 2 1', она не должна быть ' 1 3 2' в соответствии с '4 3 4'? – RomanPerekhrest

+0

@RomanPrekhrest Исходная колонка C имеет значения 4 3 4, где 4 (дубликат) является более высоким значением, поэтому должно быть рангом 1, а значение 3 должно быть 2. Надеюсь, что это ясно. – user2150845

ответ

0

Вы можете попробовать с gawk и asorti функции Array-Sorting-Functions

awk 'BEGIN{OFS="\t"} 
    NR==1{ 
     for(i=1; i<=NF; ++i) printf "Result_%s%s", $i, i==NF?ORS:OFS 
     next 
    } 
    { for(i=1; i<=NF; ++i) M[i, NR-1]=$i } 
    END{ 
     for(i=1; i<=NF; ++i){ 
      delete d; 
      for(j=1; j<=NR-1; ++j) d[M[i,j]] 
      n = asorti(d, idx) 
      for(j=1; j<=n; ++j) rank[i, idx[j]] = n-j+1 
     } 
     for(j=1; j<=NR-1; ++j) 
      for(i=1; i<=NF; ++i) 
       printf "%s%s", rank[i, M[i,j]], i==NF?ORS:OFS 
    } 
' original 

вы получите,

Result_A Result_B Result_C 
1 2 1 
2 1 2 
3 3 1 
+0

Рикардо Вы пробовали? Хмм, я получаю синтаксические ошибки в строке 3 и незаконный оператор на 16. – user2150845

+0

@ user2150845 Я использую 'gnu-awk' вкус' awk' ..... Я сказал это в первом абзаце –

+0

Рикардо Вы абсолютно правы , Прекрасно работает! большое спасибо – user2150845