我有一个重复了很多行的文件,它看起来像这样:
a
a
.
.
.
a
b
b
c
.
.
c
d
.
.
d
e
.
.
.
e
我只需要计算每个行值一次,例如,如果唯一可能的值行可以来自a,b,c,d,e
我感兴趣的数字是5
。
这是我如何计算文件中的所有行:
wc -l file
仅提供n
次a
,m
次b
等,但未向我提供任何有价值的信息。
我觉得这可以用awk,任何想法来完成吗?
答案 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