Поиск суммы уникальных значений и сколько раз они появляются - PullRequest
0 голосов
/ 23 октября 2018

У меня есть CSV-файл с

value name   date   sentence    
0000  name1  date1  I want apples
0021  name2  date1  I want bananas
0212  name3  date2  I want cars
0321  name1  date3  I want pinochio doll
0123  name1  date1  I want lemon
0100  name2  date1  I want drums
1021  name2  date1  I want grape
2212  name3  date2  I want laptop
3321  name1  date3  I want Pot
4123  name1  date1  I want WC
2200  name4  date1  I want ramen
1421  name5  date1  I want noodle
2552  name4  date2  I want film
0211  name6  date3  I want games
0343  name7  date1  I want dvd

Я хочу найти уникальное значение на вкладке имени (я знаю, что должен использовать -f 2, но затем я также хочу знать, сколько раз онипоявляются / количество приговоров, которые они сделали.

eg: name1,5
    name2,3
    name3,2
    name4,2
    name5,1
    name6,1
    name7,1

Затем я хочу сделать еще одну информацию о том, сколько человек за явку

1 appearance, 3
2 appearance ,2
3 appearance ,1
4 appearance ,0
5 appearance ,1

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

Для 1-го отчета вы можете использовать:

tail -n +2 file | awk '{print $2}' | sort | uniq -c
   5 name1
   3 name2
   2 name3
   2 name4
   1 name5
   1 name6
   1 name7

Для 2-го отчета вы можете использовать:

tail -n +2 file | awk '{print $2}'| sort | uniq -c | awk 'BEGIN{max=0} {map[$1]+=1; if($1>max) max=$1} END{for(i=1;i<=max;i++){print i" appearance,",(i in map)?map[i]:0}}'
1 appearance, 3
2 appearance, 2
3 appearance, 1
4 appearance, 0
5 appearance, 1

Сложность здесь связана с тем, что вы хотели0 и пользовательский текст appearance на выходе.

0 голосов
/ 23 октября 2018

Для ответа на первую часть используется awk ниже

awk -F" " 'NR>1 { print $2 } ' jerome.txt  | sort | uniq -c

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

> awk -F" " 'NR>1 { print $2 } ' jerome.txt  | sort | uniq -c | perl -lane '{$app{$F[0]}++} END {@c=sort keys %app; foreach($c[0] ..$c[$#c]) {print "$_ appearance,",defined($app{$_})?$app{$_}:0 }}'
1 appearance,3
2 appearance,2
3 appearance,1
4 appearance,0
5 appearance,1
>

EDIT1:

Вторая часть с использованием однострочного Perl

> perl -lane '{$app{$F[1]}++ if $.>1} END {$app2{$_}++ for(values %app);@c=sort keys %app2;foreach($c[0] ..$c[$#c]) {print "$_ appearance,",$app2{$_}+0}}' jerome.txt
1 appearance,3
2 appearance,2
3 appearance,1
4 appearance,0
5 appearance,1
>
0 голосов
/ 23 октября 2018

То, что вы ищете, является классическим примером объединения набора основных инструментов Linux в конвейере:

Это решит вашу первую проблему:

$ awk '(NR>1){print $2}' file | sort | uniq -c
      5 name1
      3 name2
      2 name3
      2 name4
      1 name5
      1 name6
      1 name7

Это решит вашу вторуюпроблема:

$ awk '(NR>1){print $2}' file | sort | uniq -c | awk '{print $1}' | uniq -c
      1 5
      1 3
      2 2
      3 1

Вы заметили, что форматирование немного отсутствует, но это, по сути, решает вашу проблему.

Конечно, в вы можете сделать это в одномиди, но я верю, что ты должен попытаться понять вышеприведенную строку.Посмотрите на man sort и man uniq.Решение :

Задача 1:

awk '(NR>1){a[$2]++}END{ for(i in a) print i "," a[i] }' file
name6,1
name7,1
name1,4
name2,3
name3,2
name4,2
name5,1

Задача 2:

awk '(NR>1){a[$2]++; m=(a[$2]<m?m:a[$2])}
     END{ for(i in a) c[a[i]]++;
          for(i=1;i<=m;++i) print i, "appearance,", c[i]+0
     }' foo.txt
1 appearance, 3
2 appearance, 2
3 appearance, 1
4 appearance, 0
5 appearance, 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...