如何计算文本文件中唯一行、重复行和出现三次的行的数量

How to count the amount of unique lines, duplicate lines and lines that appear three times in a text file

我有一个名字列表,每行一个名字保存为 .txt 文件。

我正在尝试使用 bash 来确定有多少不同的名字出现了一次、两次或三次。

例如:

names.txt 长得像

Donald
Donald
Lisa
John
Lisa
Donald

在这种情况下,唯一行数为 1,有 1 个重复,1 个名称出现 3 次。我正在尝试使用 uniq 将这些金额放在更大的列表中。我知道我可以使用 uniq -uuniq -d 来表示唯一性和重复性,但我不太确定如何处理出现 3 次的名称。

您可以在 awk:

中使用数组来获取不同的名称数量
awk '{ a[]++ } END { for (n in a) print n, a[n] } ' yourfile

我想,如果你想更进一步,你可以 运行 针对这个输出的相同 awk 脚本,但是在 $2 上,以获得计数的计数,这听起来像是喜欢你所追求的。有点像:

awk '{ a[]++ } END { for (n in a) print n, a[n] } ' test |  awk '{ a[]++ } END { for (n in a) print n, a[n] } '

将输出:

1 1
2 1
3 1

也就是说"There are 1 distinct names that show up once. There are 1 distinct names that show up 2 times. There are one distinct names that show up 3 times"

我确信这可以在一个 awk 脚本中完成,但这看起来很简单,而且很容易解析。

你想展示这样的东西吗?

3 Donald
2 Lisa
1 John

如果是,则应执行以下操作:

cat <file> | sort | uniq -c | sort -rn
$ echo 'Donald
Donald
Lisa
John
Lisa
Donald' | sort | uniq -c | awk '{print }' | sort | uniq -c
   1 1
   1 2
   1 3

右栏是重复次数,左栏是具有该重复次数的唯一名称的数量。例如。 “Donald”的重复次数为 3。

更大的例子:

echo 'Donald
Donald
Rob
Lisa
WhatAmIDoing
John
Obama
Obama
Lisa
Washington
Donald' | sort | uniq -c | awk '{print }' | sort | uniq -c
   4 1
   2 2
   1 3

四个名字(“Rob”、“WhatAmIDoing”、“John”和“Washington”)的重复次数均为 1。两个名字(“Lisa”和“Obama”)的重复次数分别为2. 一个名字(“Donald”)的重复次数为 3.

awk 救援!

awk '{a[]++} END{for(k in a) b[a[k]]++; for(k in b) print b[k], k}' names

如果您想查看每个 "repetition count" 的实际名称,perl 是一个不错的选择,因为它具有非常灵活的数据结构:

perl -lne '
    $count{$_}++;
    END {
        while (($name, $num) = each %count) {
            push @{$map{$num}}, $name;
        }
        while (($num, $names) = each %map) {
            print "$num: @$names";
        }
    }
' << NAMES
Donald
Donald
Lisa
John
Lisa
Jim
Bob
Jim
Donald
NAMES
3: Donald
1: John Bob
2: Jim Lisa