2015-05-20 2 views
1

«Using awk to bin values in a list of numbers» обеспечивает решение для среднего значения каждого набора из 3 точек в столбце с использованием awk.Среднее значение Awk по n данным в каждом столбце

Как можно расширить его до неопределенного количества столбцов, поддерживающих формат? Например:

2457135.564106 13.249116 13.140903 0.003615 0.003440 
2457135.564604 13.250833 13.139971 0.003619 0.003438 
2457135.565067 13.247932 13.135975 0.003614 0.003432 
2457135.565576 13.256441 13.146996 0.003628 0.003449 
2457135.566039 13.266003 13.159108 0.003644 0.003469 
2457135.566514 13.271724 13.163555 0.003654 0.003476 
2457135.567011 13.276248 13.166179 0.003661 0.003480 
2457135.567474 13.274198 13.165396 0.003658 0.003479 
2457135.567983 13.267855 13.156620 0.003647 0.003465 
2457135.568446 13.263761 13.152515 0.003640 0.003458 

усреднение значений каждые 5 строк, должно вывести что-то вроде

2457135.564916 13.253240 13.143976 0.003622 0.003444 
2457135.567324 13.270918 13.161303 0.003652 0.003472 

, где первый результат представляет собой среднее из первых 1-5 линий, а второй результат представляет собой среднее значение 6-10 строк.

+2

не очень уверен, что вы имеете в виду. Не могли бы вы вставить желаемый результат вместе с вашими попытками? Скрипт anubhava в другом вопросе выглядит довольно красиво и легко играть с помощью – fedorqui

+2

Используйте массив сумм и цикл 'for (i = 1; i <= NF; i ++) для управления суммированием. Для печати вам необходимо определить, какой уровень верности для исходного формата вам интересен, и как вы собираетесь определять этот формат. Что произойдет, если значение перемещается между 99999,95 и 100000,05, например? Вы просто используете разделенные пробелами числа с шестью десятичными знаками? Если это так, это легко. Если вам нужно обеспечить 7, 2, 2, 1, 1 цифры до десятичной точки, даже если цифры имеют только 5, 1, 1, 1, 1 цифры раньше, тогда вам придется работать усерднее. –

ответ

4

Принятая Ответ на Using awk to bin values in a list of numbers является:

awk '{sum+=$1} NR%3==0 {print sum/3; sum=0}' inFile 

Очевидный расширение усреднить все столбцы является:

awk 'BEGIN { N = 3 } 
    { for (i = 1; i <= NF; i++) sum[i] += $i } 
    NR % N == 0 { for (i = 1; i <= NF; i++) 
        { 
         printf("%.6f%s", sum[i]/N, (i == NF) ? "\n" : " ") 
         sum[i] = 0 
        } 
       }' inFile 

Дополнительная гибкость в том, что если вы хотите, чтобы сгруппировать блоки 5 рядов , вы просто меняете одно вхождение из 3 в 5. Это игнорирует блоки до N-1 строк в конце файла. ! Если вы хотите, вы можете добавить END блок, который выводит соответствующее среднее, если NR% N = 0.

Для ввода образца данных, выход я получил от сценария выше был:

2457135.564592 13.249294 13.138950 0.003616 0.003437 
2457135.566043 13.264723 13.156553 0.003642 0.003465 
2457135.567489 13.272767 13.162732 0.003655 0.003475 

Вы можете сделать код намного сложнее, если хотите проанализировать, что должны делать выходные форматы. Я просто использовал %.6f, чтобы обеспечить 6 знаков после запятой.

Если вы хотите N быть параметром командной строки, вы можете использовать опцию -v передать переменные настройки в awk:

awk -v N="${variable:-3}" \ 
    '{ for (i = 1; i <= NF; i++) sum[i] += $i } 
    NR % N == 0 { for (i = 1; i <= NF; i++) 
        { 
         printf("%.6f%s", sum[i]/N, (i == NF) ? "\n" : " ") 
         sum[i] = 0 
        } 
       }' inFile 

При вызова с $variable набором 5, выход генерируется из данные выборки:

2457135.565078 13.254065 13.144591 0.003624 0.003446 
2457135.567486 13.270757 13.160853 0.003652 0.003472 
+0

Большое спасибо за ваш ответ. Я изменил ваш пример двойными кавычками и экранировал символы '\ $' и '\ '', чтобы вставить ваш awk-код в сценарий bash, чтобы '3' теперь является параметром bash. –

+2

Использование:' awk -v N = $ bash_var '... code как раньше ...' '- это лучший способ передать переменные в скрипты' awk'. Конечно, вы отбросите блок BEGIN. –

+2

@leonardvertighel - НЕТ, НЕ ПОСТАВЛЯЙТЕ скрипт в двойные кавычки и начинаются с экранов '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''' ' Сделайте то, что предлагает Джонатан, плюс прочитайте http://cfajohnson.com/shell/cus-faq-2.html#Q24 и получите книгу «Эффективное программирование Awk», 4-е издание, Арнольд Роббинс. –

Смежные вопросы