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

У меня есть файл со многими номерами (только числа и каждое число в одной строке). Я хочу узнать количество строк, в которых число больше 100 (или ввести что-нибудь еще). Как я могу это сделать?

  • совпадение шаблона N раз
  • Используйте sed, чтобы найти целое слово и заменить
  • Замените строку содержимым файла с помощью sed
  • Есть ли способ обнаружить нулевые байты (␀, NUL, \ 0) в sed?
  • Проблема с форматированием даты «sed»
  • Выровнять шестнадцатеричный текстовый файл по 9 байт каждой строки
  • Почему пустая выгрузка этого `sed ... << END_SED | вырезать ... `?
  • Простая замена вкладок табов таинственным образом
  • 2 Solutions collect form web for “Подсчет количества строк, имеющих число больше 100”

    Рассмотрим этот тестовый файл:

    $ 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 был бы пустым (tip tip: iruvar ). Добавляя к нему нуль, мы меняем пустую строку на 0 , давая более правильный вывод.

    Аналогичное решение с perl

     $ seq 98 105 | perl -ne '$c++ if $_ > 100; END{print $c+0 ."\n"}' 5 

    Сравнение производительности:

    Случайный файл:

     $ 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 user 0m7.736s sys 0m0.012s $ time awk '$1>100{c++} END{print c+0}' rand_numbers.txt 14940305 real 0m8.150s user 0m8.116s sys 0m0.008s $ time awk '$1>100{c++} END{print c+0}' rand_numbers.txt 14940305 real 0m7.439s user 0m7.384s sys 0m0.024s 

    С perl

     $ time perl -ne '$c++ if $_ > 100; END{print $c+0 ."\n"}' rand_numbers.txt 14940305 real 0m4.145s user 0m4.108s sys 0m0.020s $ time perl -ne '$c++ if $_ > 100; END{print $c+0 ."\n"}' rand_numbers.txt 14940305 real 0m4.146s user 0m4.092s sys 0m0.040s $ time perl -ne '$c++ if $_ > 100; END{print $c+0 ."\n"}' rand_numbers.txt 14940305 real 0m4.196s user 0m4.172s sys 0m0.008s 

    И просто для удовольствия с grep

     $ 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 user 0m10.604s sys 0m0.012s 

    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 user 0m12.088s sys 0m0.236s 
    Linux и Unix - лучшая ОС в мире.