我有一个名称列表,每行一个名称保存为.txt文件。
我尝试使用bash来确定一次、两次或三次出现多少不同的名称。
例如:
names.txt看起来像
Donald
Donald
Lisa
John
Lisa
Donald
在这种情况下,唯一行的数量为1,有1个重复,1个名称出现3次。我正试图使用uniq
将这些金额列在一个更大的列表中。我知道uniq -u
和uniq -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