搜索唯一值的数量及其出现的次数

时间:2018-10-23 09:31:22

标签: linux shell unix terminal

我有一个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 :(得分:1)

第一部分的答案是在下面使用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
>

答案 1 :(得分:0)

您所追求的是在管道中结合一组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 sortman 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

答案 2 :(得分:0)

对于第一份报告,您可以使用:

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

对于第二份报告,您可以使用:

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