Команда awk для создания столбца на основе значений в двух других столбцах - PullRequest
0 голосов
/ 13 мая 2018

У меня есть файл с двумя столбцами, например:

12 c
16 a
50 b
32 b
15 c
25 c
...

Я хочу сначала отсортировать таблицу по второму столбцу, затем отсортировать по убыванию первый столбец, а затем создать третий столбец с именем rank.word.'.

, поэтому вывод должен выглядеть следующим образом:

16 a 1.a
50 b 1.b
32 b 2.b
25 c 1.c
15 c 2.c
12 c 3.c
...

сортировка легко, но есть идеи, как получить третий столбец с помощью базовой команды оболочки, такой как awk?

Ответы [ 3 ]

0 голосов
/ 13 мая 2018

sort + awk решение:

sort -k2 -k1nr file | awk '{ print $1, $2, ++a[$2]"."$2 }'

Выход:

16 a 1.a
50 b 1.b
32 b 2.b
25 c 1.c
15 c 2.c
12 c 3.c
0 голосов
/ 13 мая 2018

Один в GNU awk (массив 2d, for порядок перемещения). СЛЕДУЕТ работать по крайней мере с данными, которые вы предоставили, но дайте мне знать, если они не работают с вашими реальными данными.

$ awk '{
    a[$2][$1]++                               # hash data to a, count duplicates 
}
END {
    PROCINFO["sorted_in"]="@ind_str_asc"      # start with ordering $2 
    for(i in a) {
        PROCINFO["sorted_in"]="@ind_num_desc" # then $1
        for(j in a[i])
            for(k=1;k<=a[i][j];k++)           # handle duplicates
                print j,i,++c[i] "." i        # output
        PROCINFO["sorted_in"]="@ind_asc_asc"  # set order for $2 again
     }
}' file
16 a 1.a
50 b 1.b
32 b 2.b
25 c 1.c
15 c 2.c
12 c 3.c

Конечно, это не удастся, если есть дублирующиеся пары значений. Это больше не будет сбоем для дубликатов.

0 голосов
/ 13 мая 2018

awk '{if($2 != prev) idx=1;else idx++;prev=$2;print $1 " " $2 "." idx}'

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