我有一个名单列表,每行一个名称保存为.txt文件。
我正在尝试使用bash来确定有多少个不同的名字出现一次,两次或三次。
例如:
names.txt看起来像
Donald
Donald
Lisa
John
Lisa
Donald
在这种情况下,唯一行的数量为1,有1个重复,1个名称出现3次。我正在尝试使用uniq
将这些金额放在更大的列表中。我知道我可以将uniq -u
和uniq -d
用于唯一身份和重复项,但我不太确定如何使用出现3次的名称来执行此操作。
答案 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