Подсчет количества строк, имеющих число больше 100

Подсчет количества строк, имеющих число больше 100

У меня есть файл с большим количеством чисел (только числа, и каждое число находится в одной строке). Я хочу узнать количество строк, в которых число больше 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было бы пусто (совет от шляпы:ирувар). Добавляя к нему ноль, мы меняем пустую строку на a 0, что дает более правильный вывод.

решение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(Обновлено: быстрее, чем даже Perl с LC_ALL=C)

$ 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

Связанный контент