Как подсчитать количество вхождений всех строк в файле, получая среднее значение для каждой строки

Следующее выглядит как неактивный LV:

root@orwell:/tmp# lvconvert --splitmirrors 1 --name debian_boot_copy /dev/newdebian/debian_boot

  Unable to determine sync status of newdebian/debian_boot.
  Unable to split newdebian/debian_boot while it is not in-sync.

Я проверил с 2.02.172, и это именно то, что я получил, когда LV был неактивен.

Разделение ветви разрешено только при синхронизации RAID. И LVM не может определить, синхронизировано ли устройство, пока оно не активно.

Сначала вы должны активировать устройство перед любыми попытками разрезать ногу:

lvchange -ay newdebian/debian_boot

И затем дождитесь синхронизации -в LVM нет команды опроса, чтобы сделать это, вам придется либо подождать некоторое время и проверить себя, либо написать скрипт.

ПРИМЕЧАНИЕ. :Может быть безопаснее использовать вывод dmsetup status, так как для LVM версии 2.02.171 и старше может быть сообщено о 100% из-за округления, когда устройство не было полностью синхронизировано.

Только после этого вы сможете успешно выполнить указанную выше операцию lvconvert --splitmirrors.

-2
11.10.2019, 05:34
3 ответа

Попробуйтеawk:

awk '
    BEGIN{FS=OFS="\t"} # if your file is space-delimited, leave this out
    {c[$1]++;v[$1]+=$2}
    END{
        print "Name","count","Average"
        for(f in c){print f,c[f],v[f]/c[f]}
    }
' file
0
28.01.2020, 05:16

Мне нравятся оба ответа (SQL, AWK ), потому что они являются стандартными языками и реализуют алгоритм идиоматически. Я собирался еще больше понизить вопрос, потому что он, кажется, настаивает на конкретном решении.

Но именно в этом проблема fgdark :вы слишком полагаетесь на утилиты и не понимаете (алгоритма ).

How could I pipe together cut, grep, numaverage in this manor (other commands may help such as cat, uniq, wc)?

Вы можете «легко» найти конвейерное решение, начав с временных файлов, а когда цепочка заработает, вы объедините их вместе. Результат будет неудовлетворительным. У меня нет numaverage, для начала. Производительность также.

Здесь необходим какой-то «настоящий» язык программирования, например SQL или AWK. Или perl, или python, или C. Или bash -, но bash как скриптовый язык с ассоциативными массивами и арифметическими операторами , а не bash "только" как оболочка.

Вам не нужна усредненная()функция , как в случае решения SQL, вы можете просто считать, складывать и делить данные, которые вы прочитали, в свои массивы.

Поэтому, если вы хотите создавать дополнительные отчеты по данным, вам следует выбрать язык . SQL немного особенный, он хорошо подходит для анализа данных . Другие упомянутые (awk, perl, python, C, даже bash )сильны в данных обработке(манипулировании переменными/массивами/структурами ). Но есть большое совпадение.


Несколько лет я работал с SQL; так я бы сохранил запрос и его вызов:

SQL='select a as Name, count(*) as Count, avg(b) as Average' 
SQL+=' from file'
SQL+=' group by a'

csvsql -tSH --query $SQL file | csvformat -T

'Это не критика, а попытка проиллюстрировать, как структурирован-язык структурированных запросов . Это хрестоматийная демонстрация предложения group byс агрегатными функциями countи avg.

Bash предоставляет синтаксис +=, позволяющий легко это сделать.

0
28.01.2020, 05:16

Используйте csvsqlизcsvkit:

если ваш файл разделен пробелом -:

csvsql -d' ' -S -H --query 'select a as Name, count(*) as count, avg(b) as Average from file group by a' file \
    | csvformat -D' '

или если ваш файл разделен табуляцией -:

csvsql -t -S -H --query 'select a as Name, count(*) as count, avg(b) as Average from file group by a' file \
    | csvformat -T

Выход:

Name    count   Average
NEUTRON 2   14.471691
PION+   2   0.7710725
PION-   3   7.74835266667

Возможно, вам потребуется установить его вместе сpip:

pip install csvkit
1
28.01.2020, 05:16

Теги

Похожие вопросы