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