Обработка связей при ранжировании в bash - PullRequest
1 голос
/ 15 января 2020

Допустим, у меня есть список чисел, которые уже отсортированы, как показано ниже

100
222
343
423
423
500

Я хочу создать поле ранга, чтобы одинаковые значения присваивались одинаковому рангу

100   1
222   2
343   3
423   4
423   4
500   5

Я использовал следующий фрагмент кода для имитации c поля ранга

awk '{print $0, NR}' file

Это дает мне ниже, но технически это число.

100   1
222   2
343   3
423   4
423   5
500   6

Как я go об этом? Я - абсолютный новичок в bash, поэтому был бы очень признателен, если бы вы могли добавить небольшое объяснение ради обучения.

Ответы [ 3 ]

4 голосов
/ 15 января 2020

Это работа для awk:

$ awk '{if($0!=p)++r;print $0,r;p=$0}' file

Вывод:

100 1
222 2
343 3
423 4
423 4
500 5

Объяснено:

$ awk '{           # using awk
if($0!=p)          # if the value does not equal the previous value
    ++r            # increase the rank
print $0,r         # output value and rank
    p=$0           # store value for next round
}' file
2 голосов
/ 15 января 2020

Не могли бы вы попробовать следующее.

awk 'prev==$0{--count} {print $0,++count;prev=$1}' Input_file

Объяснение: Добавление подробного объяснения для вышеуказанного кода.

awk '                 ##Starting awk code from here.
prev==$0              ##Checking condition if variable prev is equal to current line then do following.
{
  --count             ##Subtract count variable with 1 here.
}
{
  print $0,++count    ##Printing current line and variable count with increasing value of it.
  prev=$1             ##Setting value of prev to 1st field of current line.
}
' Input_file          ##Mentioning Input_file name here.
1 голос
/ 15 января 2020

еще awk

$ awk '{print $1, a[$1]=a[$1]?a[$1]:++c}' file

100 1
222 2
343 3
423 4
423 4
500 5

, где файл не нужно сортировать, например, после добавления нового 423 в конце файла

$ awk '{print $1, a[$1]=a[$1]?a[$1]:++c}' file

100 1
222 2
343 3
423 4
423 4
500 5
423 4

увеличить счетчик рангов a для нового наблюдаемого значения, в противном случае использовать зарегистрированное значение для ключа. поскольку c инициализируется нулем, предварительно увеличьте значение. При этом будет использоваться одно и то же значение rank для одного и того же ключа независимо от позиции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...