我有一个包含许多数字的文件(只有数字,每个数字都在一行中)。我想找出数字大于 100(或者实际上是其他值)的行数。我怎样才能做到这一点?
答案1
让我们考虑这个测试文件:
$ cat myfile
98
99
100
101
102
103
104
105
现在,我们来计算数字大于 100 的行数:
$ awk '$1>100{c++} END{print c+0}' myfile
5
怎么运行的
$1>100{c++}
每当该行上的数字大于 100 时,该变量
c
就会增加 1。END{print c+0}
当我们读完文件后,变量
c
就会被打印出来。通过添加
0
到c
,我们强制 awk 将其c
视为数字。如果有任何带有数字的行>100
,则c
已经是数字了。如果没有,那c
就是一个空的(帽子提示:伊鲁瓦尔)。通过向其添加零,我们将空字符串更改为 a0
,从而给出更正确的输出。
答案2
类似的解决方案perl
$ seq 98 105 | perl -ne '$c++ if $_ > 100; END{print $c+0 ."\n"}'
5
速度对比:连续 3 次运行报告的数字
随机文件:
$ perl -le 'print int(rand(200)) foreach (0..10000000)' > rand_numbers.txt
$ perl -le 'print int(rand(100200)) foreach (0..10000000)' >> rand_numbers.txt
$ shuf rand_numbers.txt -o rand_numbers.txt
$ tail -5 rand_numbers.txt
114
100
66125
84281
144
$ wc rand_numbers.txt
20000002 20000002 93413515 rand_numbers.txt
$ du -h rand_numbers.txt
90M rand_numbers.txt
和awk
$ time awk '$1>100{c++} END{print c+0}' rand_numbers.txt
14940305
real 0m7.754s
real 0m8.150s
real 0m7.439s
和perl
$ time perl -ne '$c++ if $_ > 100; END{print $c+0 ."\n"}' rand_numbers.txt
14940305
real 0m4.145s
real 0m4.146s
real 0m4.196s
只是为了好玩grep
(更新:甚至比 LC_ALL=C 的 Perl 还要快)
$ time grep -xcE '10[1-9]|1[1-9][0-9]|[2-9][0-9]{2,}|1[0-9]{3,}' rand_numbers.txt
14940305
real 0m10.622s
$ time LC_ALL=C grep -xcE '10[1-9]|1[1-9][0-9]|[2-9][0-9]{2,}|1[0-9]{3,}' rand_numbers.txt
14940305
real 0m0.886s
real 0m0.889s
real 0m0.892s
sed
一点也不好玩:
$ time sed -nE '/^10[1-9]|1[1-9][0-9]|[2-9][0-9]{2,}|1[0-9]{3,}$/p' rand_numbers.txt | wc -l
14940305
real 0m11.929s
$ time LC_ALL=C sed -nE '/^10[1-9]|1[1-9][0-9]|[2-9][0-9]{2,}|1[0-9]{3,}$/p' rand_numbers.txt | wc -l
14940305
real 0m6.238s