我有一个文件在文件的随机位置有以下用户名:
albert@ghhdh
albert@jdfjgjjg
john@jfkfeie
mike@fjfkjf
bill@fjfj
bill@fkfkfk
用户名是@符号左侧的名称。 我想使用unix命令grep文件中的用户名,然后计算唯一的用户名。
因此,使用上面的示例,输出应该说明有4个唯一用户(我只需要计数作为输出,没有单词)
有人可以帮我确定正确的计数吗?
答案 0 :(得分:1)
您可以在@
之前提取单词,对它们进行排序并计算它们:
cat test.txt | cut -d '@' -f 1 | sort | uniq -c
使用test.txt
:
albert@ghhdh
john@jfkfeie
bill@fjfj
mike@fjfkjf
bill@fkfkfk
albert@jdfjgjjg
输出:
2 albert
2 bill
1 john
1 mike
请注意,重复的用户名不必在输入列表中分组。
如果您只对uniq用户的数量感兴趣:
cat test.txt | cut -d '@' -f 1 | sort -u | wc -l
# => 4
或更短:
cut -d '@' -f 1 test.txt | sort -u | wc -l
答案 1 :(得分:1)
这是一个解决方案,即在一行中的任何地方找到用户名(不仅仅是在开头),即使一行中有多个用户名,并找到它们的唯一计数:
grep -oE '\b[[:alpha:]_][[:alnum:]_.]*@' file | cut -f1 -d@ | sort -u | wc -l
-o
仅提取匹配的部分-E
处理扩展正则表达式\b[[:alpha:]_][[:alnum:]]*@
匹配用户名(字边界\b
后面的字符串,以字母或下划线开头,后跟零个或多个字母数字和其他允许的字符,以@
结尾cut -f1 -d@
提取用户名部分,然后对其进行排序并计入唯一名称答案 2 :(得分:0)
如果允许使用awk,则使用一个awk命令更快:
awk -F"@" '!seen[$1]++{c++}END{print "Unique users =" c}'
小解释:
使用@作为分隔符(-F),为awk查找字段1 = $ 1
对于每次不再看到的字段1,我们增加一个计数器c
同时我们增加了特定的字段1,所以如果再次找到测试"没有看到"无效。
最后,我们只打印出独特"看到"的柜台。
此外,此解决方案不需要预先排序。即使文件未排序,也会找到重复项。