AWK подсчитывает количество вхождений столбца A на основе уникальности столбца B - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть файл с несколькими столбцами, и я хочу подсчитать вхождение одного столбца на основе значения второго столбца, уникального для первого столбца. EX:

column 10            column 15
orange               New York
green                New York
blue                 New York
gold                 New York
orange               Amsterdam
blue                 New York
green                New York
orange               Sweden
blue                 Tokyo
gold                 New York

Я довольно новичок в использовании командкак awk, и я стремлюсь получить больше практических знаний.

Я пробовал несколько различных вариантов

awk '{A[$10 OFS $15]++} END {for (k in A) print k, A[k]}' myfile

, но, не совсем понимая код, вывод был не тем, что яожидается.

Я ожидаю выхода

orange     3
blue       2
green      1
gold       1

Ответы [ 2 ]

0 голосов
/ 03 ноября 2019

Одиночная версия вызова GNU awk (также работает с awk без GNU, просто не сортирует вывод):

$ gawk 'BEGIN{ OFS=FS="\t" }
        NR>1 { names[$2,$1]=$1 }
        END { for (n in names) colors[names[n]]++;
              PROCINFO["sorted_in"] = "@val_num_desc";
              for (c in colors) print c, colors[c] }' input.tsv
orange  3
blue    2
gold    1
green   1

При необходимости измените номера столбцов для соответствия реальным данным.


Бонусное решение, использующее sqlite3:

$ sqlite3 -batch -noheader <<EOF
.mode tabs
.import input.tsv names
SELECT "column 10", count(DISTINCT "column 15") AS total
FROM names
GROUP BY "column 10"
ORDER BY total DESC, "column 10";
EOF
orange  3
blue    2
gold    1
green   1
0 голосов
/ 03 ноября 2019

с GNU awk. Я предполагаю, что tab - это ваш разделитель полей.

awk '{count[$10 FS $15]++}END{for(j in count) print j}' FS='\t' file | cut -d $'\t' -f 1 | sort | uniq -c | sort -nr

Вывод:

      3 orange
      2 blue
      1 green
      1 gold

Полагаю, это может быть более элегантно.

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