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

时间:2016-05-04 20:28:35

标签: linux bash ubuntu uniq

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

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

例如:

names.txt看起来像

Donald
Donald
Lisa
John
Lisa
Donald

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

5 个答案:

答案 0 :(得分:2)

$ echo 'Donald
Donald
Lisa
John
Lisa
Donald' | sort | uniq -c | awk '{print $1}' | sort | uniq -c
   1 1
   1 2
   1 3

右列是重复计数,左列是具有该重复计数的唯一名称的数量。例如。 “唐纳德”的重复次数为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”,“WhatAmIDoing”,“John”和“Washington”)的重复次数均为1.两个名字(“Lisa”和“Obama”)的重复次数均为2。一个名字(“唐纳德”)的重复次数为3。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

通过在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

在说什么&#34;有一个不同的名字出现一次。有1个不同的名字出现2次。有一个不同的名字出现3次&#34;

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

答案 3 :(得分:0)

你想要展示这样的东西吗?

3 Donald
2 Lisa
1 John

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

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

答案 4 :(得分:0)

awk救援!

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