计算不同行数

Count number of different lines

我有一个文件有很多行重复,它看起来像这样:

a
a
.
.
.
a
b
b
c
.
.
c
d
.
.
d
e
.
.
.
e

我只需要计算每行值一次,例如,如果行的唯一可能值来自 a,b,c,d,e,我感兴趣的数字是 5

这是我计算文件中所有行数的方法:

wc -l file

只给了我 namb 等,没有提供任何有价值的信息。

我觉得这可以使用 awk 来完成,有什么想法吗?

一定要awk吗?使用 shell-commands 的一种方法是

$ sort input.txt | uniq -c
     10 .
      3 a
      2 b
      2 c
      2 d
      2 e

使用 awk:

$ awk '{a[[=11=]]++}END{for(i in a){print i, a[i]}}' input.txt
a 3
b 2
. 10
c 2
d 2
e 2

你真的不需要为此做任何编程,例如

$ sort -u input.txt | wc -l

sort -u 对输入文件进行排序,删除任何重复项,然后将输出通过管道传输到 wc -l 以生成这些唯一行的计数。

鉴于此文件:

$ cat /tmp/lines.txt
a
a
.
.
.
a
b
b
c
.
.
c
d
.
.
d
e
.
.
.

您还可以使用 Perl 来过滤要统计的行类型。在这种情况下,只有字母:

$ perl -lane '$c{}++ if /^(\w+)/; END {print "$_: $c{$_}" foreach (sort keys%c); $s = keys %c; print "total uniques: $s"}' /tmp/lines.txt
a: 3
b: 2
c: 2
d: 2
e: 2
total uniques: 5

通过散列中键值对的数量找到唯一值总数 %c

与awk类似,你可以这样做:

$ awk '/\w+/{ a[[=12=]]++}END{for(i in a){print i, a[i]; c++} print "unique lines:", c}' /tmp/lines.txt
a 3
b 2
c 2
d 2
e 2
unique lines: 5

或者,拼凑出一个 grep/uniq/wc 解决方案:

$ grep -E '\w+' /tmp/lines.txt | uniq | wc -l
       5

在 awk 中执行此操作的惯用方法:

awk '!seen[[=10=]]++' file

仅在第一次看到时打印一行

awk '!seen[[=10=]]++{cnt++} END{print cnt+0}' file