【问题标题】:Search the amount of unique value and how many times they appear搜索唯一值的数量以及它们出现的次数
【发布时间】:2018-10-23 09:31:22
【问题描述】:

我有一个 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

【问题讨论】:

  • 我认为实际的 csv 文件看起来有点不同。您的示例在两个字段之间有 2 步。能否给出实际格式(分隔符可以是','或';'或'^')?

标签: linux shell unix terminal


【解决方案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
>

【讨论】:

  • 你能用一个 perl 来做吗?这将是一个很好的补充。
  • '@kvantour.. 会试一试
【解决方案2】:

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

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

【讨论】:

  • 您可以使用 END{for(i=1;i
  • 编辑了答案。谢谢!
  • 如果我想删除“外观”字符串并只打印 1,2 2,100 3,21 等等怎么办?
  • 你可以直接使用awk 'NR&gt;1{print $2}' file | sort | uniq -c | awk '{print $1}' | sort | uniq -c
【解决方案3】:

您所追求的是在管道中组合一组 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 的解决方案是:

问题一:

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部分的答案不见了。
  • @stack0114106 我不明白你对问题 2 的意思。但现在更新了。
  • 我的意思是问题2..所以你现在就这样做了.. np
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-17
  • 2011-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多