如何在文件中找到最常见的名称?

How to find the most common name in file?

我的文件内容(5 列):

text1:##text1:27438:1001:Name Surname Role:
text1:##text1:27438:1001:Name2 Surname Role:
text1:##text1:27438:1001:Name3 Surname Role:
text1:##text1:27438:1001:Name4 Surname Role:
......
+10000 lines

我想找到最常见的名字。

我试过的是:

cat /opt/users | awk '{print }' | sort | uniq -c | sort -n | tail -1

但我得到的是一个数值。

我是不是弄错了?

awk '{print }'

接下来我可以尝试什么命令?

过滤空行并逆序排序(sort -nr):

grep -v -e "^$" /opt/users | cut -f5 -d: | \
  cut -f1 -d" " | sort | uniq -c | sort -nr | tail -1

如前所述,awk 使用 space/tab 个字符作为默认字段分隔符(-F 选项)。

您似乎需要添加 : 作为字段分隔符。 Space 是默认分隔符,如果您使用它,字段将按如下方式分配:

 = text1:##text1:27438:1001:Name
 = Surname 
 = Role:

另外,让awk直接打开并读取文件。

这里,:space都作为字段分隔符:

awk -F'[: ]' '{print }' /opt/users | sort | uniq -c | sort -rn | head -1

然后分配字段变为:

 = text1
 = ##text1
 = 27438
 = 1001
 = Name
 = Surname 
 = Role
 =        (empty)

注意:您还有内置变量 NF,它将告诉您每行分配的 F 字段的 N 数量。 8 在上面的例子中。

使用 GNU awk,您不需要其他工具。等待对我上面的评论的回答:

gawk -F: '
    {count[]++}
    END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        for (name in count) {
            print count[name], name
            exit
        }
    }
' file

在名称字段中找到最常见的单词

    # replace `{count[]++}` with
    {
        n = split(, names, /[[:blank:]]+/)
        for (i=1; i<=n; i++) count[names[i]]++
    }