У меня есть список номеров в файле, по одному в строке. Как я могу получить минимальные, максимальные, средние и средние значения? Я хочу использовать результаты в скрипте bash.
Хотя моя непосредственная ситуация с целыми числами, решение для чисел с плавающей запятой было бы полезно в дальнейшем, но простой целочисленный метод подойдет.
bash
awk
arithmetic
bc
Peter.O
источник
источник
Ответы:
Вы можете использовать язык программирования R .
Вот быстрый и грязный R-скрипт:
Обратите внимание,
"stdin"
вscan
котором есть специальное имя файла для чтения из стандартного ввода (то есть из каналов или перенаправлений).Теперь вы можете перенаправить ваши данные через стандартный ввод в скрипт R:
Также работает для плавающих точек:
Если вы не хотите писать файл сценария R, вы можете вызвать настоящую однострочную строку (с переносом строки только для удобства чтения) в командной строке, используя
Rscript
:Прочитайте прекрасные руководства R на http://cran.r-project.org/manuals.html .
К сожалению, полная ссылка доступна только в формате PDF. Другой способ прочитать ссылку - набрать
?topicname
в приглашении интерактивный R-сеанс.Для полноты: есть команда R, которая выводит все нужные вам значения и многое другое. К сожалению, в удобном для человека формате, который трудно анализировать программно.
источник
r-base
.R
язык, безусловно, является лучшим для моих требований в этой ситуации. Согласно ответу Жиля,Rscript
интерфейс к файлам сценариев является наиболее подходящим (по сравнениюR
с интерактивным интерфейсом) ... и R в терминале делает его удобным калькулятором. или тестовая среда (например, python :)cat datafile | Rscript -e 'print(summary(scan("stdin")));'
На самом деле я держу небольшую программу awk, чтобы получить сумму, количество данных, минимальное значение, максимальное значение, среднее значение и медиану одного столбца числовых данных (включая отрицательные числа):
Вышеприведенный скрипт читает из stdin и печатает разделенные табуляцией столбцы вывода в одну строку.
источник
NR==1
можно начинать (бесполезное использование if) вместе с проверками min / max, так что вся инициализация может быть расположена в разделе BEGIN (хорошо!) ... Допуск к комментариям тоже приятный штрих .. Спасибо, +1 ...awk
предполагается, что «новые» переменные равны нулю, поэтому в этом случаеBEGIN{}
раздел не нужен. Я исправил перенос (нет необходимости избегать разрывов строк). Я также использовалOFS="\t"
для очисткиprint
строки и реализовал второй комментарий @ Peter.O. (Да, мое регулярное выражение позволяет.
, но, какawk
интерпретирует это как0
, это приемлемо.)awk
сценарий сейчас существенно отличается. Я почти чувствую, что вы должны взять кредит для вышеупомянутой программы, чтобы дать кредит, где кредит должен.С GNU datamash :
источник
brew install datamash
дает вам рабочую версию для macOS, если у вас установлен Hombrew.Минимальное, максимальное и среднее значения довольно легко получить с помощью awk:
Вычислить медиану немного сложнее, так как вам нужно отсортировать числа и некоторое время сохранить их в памяти или прочитать их дважды (первый раз, чтобы посчитать их, второй - чтобы получить медиану). Вот пример, который хранит все числа в памяти:
источник
asort
вместо pipedsort
и, кажется, правильно сортирует целые и десятичные числа .. Вот ссылка на мою получившуюся версию paste.ubuntu.com/612674 ... (И примечание для Ким: я экспериментировал с awk уже пару часов Работа с примером личного интереса намного лучше для меня) ... Общее замечание для читателей: мне все еще интересно увидеть другие методы. чем компактнее, тем лучше. Я подождуPythonpy хорошо работает для такого рода вещей:
источник
Минимум:
Максимум:
Медиана:
Средний:
В
jq
на-s
(--slurp
опции) создает массив для входных линий после разбора каждой строки , как JSON, или в виде числа в данном случае.источник
источник
echo file.txt
выглядит не совсем правильно, может бытьcat
И один (длинный) лайнер Perl, включая медиану:
Используются специальные опции:
-0777
: читать весь файл сразу, а не построчно-a
: автоматическое разбиение на массив @FБолее читаемая версия скрипта тоже самое:
Если вы хотите десятичные дроби, заменить
%d
что-то вроде%.2f
.источник
Simple-r это ответ:
Он использует среду R для упрощения статистического анализа.
источник
Просто для того, чтобы на этой странице были представлены различные варианты, вот еще два способа:
1: октава
Вот быстрый пример октавы.
2: bash + специализированные инструменты .
Для bash для обработки чисел с плавающей точкой этот скрипт использует
numprocess
иnumaverage
из пакетаnum-utils
.PS. У меня также был разумный взгляд
bc
, но для этой конкретной работы она не предлагает ничего кроме того, чтоawk
делает. Это (как указывает 'c' в 'bc') калькулятор - калькулятор, который требует много программирования, какawk
и этот скрипт bash ...источник
Я буду вторым выбором R Лесманы и предложу свою первую программу R. Он читает одно число в строке на стандартном вводе и записывает четыре числа (мин, макс, среднее, медиана), разделенных пробелами, в стандартный вывод.
источник
R
это интерактивный интерфейс иRscript
управляет скриптовыми файлами, которые могут быть исполняемыми в соответствии с вашим примером hash-bang , или вызывается из скрипта bash. Скрипты могут обрабатывать аргументы командной строки (например, stackoverflow.com/questions/2045706/… ), поэтому это выглядит хорошо ... Также выражения R могут использоваться в bash через-e
... but Мне интересно, как этоR
сравнивать сbc
...Ниже
sort
/awk
тандем это делает:(он рассчитывает медиану как среднее из двух центральных значений, если количество значений четное)
источник
Если взять реплики из кода Брюса, то здесь есть более эффективная реализация, которая не хранит все данные в памяти. Как указано в вопросе, предполагается, что входной файл имеет (самое большее) одно число на строку. Он считает строки во входном файле, которые содержат квалифицирующий номер, и передает счет
awk
команде вместе с (предшествующими) отсортированным данным. Так, например, если файл содержиттогда вход на
awk
самом делеЗатем
awk
скрипт захватывает количество данных вNR==1
блоке кода и сохраняет среднее значение (или два средних значения, которые усредняются для получения медианы), когда он их видит.источник
cat
команды; см UUOC . … (Продолжение)FILENAME
и знаете, что вы его устанавливаете, но, в общем, вы всегда должны заключать в кавычки переменные оболочки, если у вас нет веских причин не делать этого, и вы уверен, что ты знаешь, что делаешь. (4) И ваш ответ, и Брюс игнорируют отрицательный ввод (т. Е. Числа, начинающиеся с-
); в этом вопросе нет ничего, что могло бы предположить, что это правильное или желаемое поведение. Не плохо себя чувствую; Прошло более четырех лет, и, видимо, я первый человек, который заметил.cat
и добавил к объяснению.Это
num
крошечнаяawk
обертка, которая именно это и делает, например,это спасает вас от изобретения колеса в ультрапортативном awk. Документы приведены выше, а прямая ссылка здесь (см. Также страницу GitHub ).
источник
С
perl
:источник
cat/python
Единственное решение - не пустое доказательство ввода!источник
Если вы больше заинтересованы в полезности, чем в том, чтобы быть крутым или умным, тогда
perl
это более простой выбор, чемawk
. По большому счету он будет на каждом * nix с единообразным поведением, и его легко и бесплатно установить на windows. Я думаю, что это также менее загадочноawk
, и будут некоторые статистические модули, которые вы могли бы использовать, если бы вы хотели на полпути между написанием этого сами и чем-то вроде R. Мой довольно непроверенный (на самом деле я знаю, что есть ошибки, но это работает для моих целей )perl
сценарий занял около минуты, и я предполагаю, что единственная загадочная частьwhile(<>)
- это очень полезное сокращение, означающее, что файл (ы) передается в качестве аргументов командной строки, читается строка за раз и помещается эта строка в специальной переменной$_
, Таким образом, вы можете поместить это в файл с именем count.pl и запустить его какperl count.pl myfile
. Кроме того, должно быть до боли очевидно, что происходит.источник
источник
sh
) в качестве интерпретатора. Также существует проблема с тем, как данные считываются в массив из файла.