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



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

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

例如:

names.txt看起来像

Donald
Donald
Lisa
John
Lisa
Donald

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

$ echo 'Donald
Donald
Lisa
John
Lisa
Donald' | sort | uniq -c | awk '{print $1}' | 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 $1}' | sort | uniq -c
   4 1
   2 2
   1 3

四个名字("Rob"、"WhatAmIDing"、"John"one_answers"Washington")的重复次数分别为1。两个名字("丽莎"one_answers"奥巴马")的重复次数各为2。一个名字("唐纳德")的重复次数为3。

如果您想查看每个"重复计数"的实际名称,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

使用awk:中的数组可以获得不同的名称计数

awk '{ a[$1]++ } END { for (n in a) print n, a[n] } ' yourfile

我想,如果你想更进一步,你可以对这个输出运行相同的awk脚本,但只需2美元,就可以获得计数,这听起来像你想要的。有点像:

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

将输出:

1 1
2 1
3 1

意思是说"有1个不同的名字出现一次。有1个独特的名字出现2次。有一个独特的名称出现3次"

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

您想显示这样的内容吗?

3 Donald
2 Lisa
1 John

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

cat <file> | sort | uniq -c | sort -rn

awk前往救援!

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

最新更新