计算不同行数

时间:2015-01-25 21:03:58

标签: awk count line

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

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

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

这是我如何计算文件中的所有行:

wc -l file

仅提供namb等,但未向我提供任何有价值的信息。

我觉得这可以用awk,任何想法来完成吗?

5 个答案:

答案 0 :(得分:3)

它必须是awk吗?使用shell命令的一种方法是

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

使用awk:

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

答案 1 :(得分:2)

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

$ sort -u input.txt | wc -l

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

答案 2 :(得分:1)

鉴于此文件:

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

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

$ perl -lane '$c{$1}++ 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[$0]++}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

答案 3 :(得分:0)

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

awk '!seen[$0]++' file

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

答案 4 :(得分:0)

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