我想计算此演示文稿的文本文件中不同名称的数量:
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
<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
@αғ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
使用-->来计算行数- 完毕