计算不同行数
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
只给了我 n
次 a
、m
次 b
等,没有提供任何有价值的信息。
我觉得这可以使用 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
我有一个文件有很多行重复,它看起来像这样:
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 来完成,有什么想法吗?
一定要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