计算文件中不同名称的数量

计算文件中不同名称的数量

我想计算此演示文稿的文本文件中不同名称的数量:

2008 girl Avah
2009 girl Avah
2008 girl Carleigh
2011 girl Kenley
2012 boy Joseph
2013 boy Joseph
2014 boy Isaac
2014 boy Brandon

所以基本上我想跳过重复并将答案 6 作为答案。我尝试awk仅访问第三列,但无法让它打印行数。

答案1

awk

<fileName awk '!nameSeen[$3]++{ count++ } END{ print count }'

如果找到新名称,则!nameSeen[$3]++增加计数器count++并打印END计数器值。

答案2

由于您的文件似乎是在名称列上预先排序的,因此您可以使用uniq( -f)--skip-fields选项仅输出每个名称的第一行,然后计算行数:

uniq -f2 FileName | wc -l

或者

uniq --skip-fields=2 FileName | wc -l

如果您的数据不是预先排序,您可以结合sort -u字段-k规范来实现相同的目的(尽管在 GNU 手册页中没有明确记录sort):

sort -uk3 FileName | wc -l

对于这个任务来说这有点过度了,但是你也可以使用 GNU Datamash:

datamash -W countunique 3 < FileName

答案3

一种非常简短且简单的方法,使用 Miller (https://github.com/johnkerl/miller

mlr --nidx uniq -g 3 -n input.txt

答案4

一个相当简单快捷的方法,可以解释如下:

cat FileName | sed 's/[0-9]*//g' | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l

或者为了满足@αғsнιη担心关于 乌拉尔大学

<FileName sed 's/[0-9]*//g' | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l

或者其他乌拉尔大学兼容命令:

sed 's/[0-9]*//g' <FileName | sed 's/\<boy\>//g' | sed 's/\<girl\>//g' | sort -u | wc -l

通知@Rebi Khalifa

@αғsнιη 正确地在下面的评论中写道:

<fileName cut -d' ' -f3 |sort -u |wc -l;cat filename | ...乌拉尔大学

@steeldriver 正确地在下面的评论中写道:

我建议使用cut而不是所有这些sed命令 - 你至少应该将它们组合成一个调用例程。sed -E -e 's/^[0-9]+//' -e 's/\b(boy|girl)\b//'

他们都使用了字段选择方法是相同的您尝试实施的解决问题的方法根据你在问题中所写的内容

我尝试使用 awk 仅访问第三列,但无法让它打印行数。


一个人不需要复杂的在 Ubuntu 中完成任务!可以用许多难以想象的方式完成任务。

赞美KISS原则是将|简单的命令一个接一个地传递下去,直到任务完成:

  • 阅读文件内容cat FileName-->
  • 管道连接|-->
  • 消除数字组sed 's/[0-9]*//g'-->
  • 管道连接|-->
  • 删除该词男生sed 's/\<boy\>//g'-->
  • 管道连接|-->
  • 删除该词女孩sed 's/\<girl\>//g'-->
  • 仅有的名称现在还剩下... -->
  • 管道连接|-->
  • sort -u使用-->对名称进行排序并删除重复项
  • 仅有的唯一名称ar 现在还剩下 -->
  • 管道连接|-->
  • wc -l使用-->来计算行数
  • 完毕

相关内容