Усредните каждые N строк и добавьте среднее значение в виде нового столбца, в идеале в положение ceil (N / 2) - PullRequest
0 голосов
/ 24 февраля 2020

Я очень новичок в awk. Я пытался изменить решение с AWK, разбивая каждые N строк , но, к сожалению, мне не удается правильно добавить среднее значение как новый столбец в мой файл.

В первом столбце у меня есть метки даты / времени, затем в следующих столбцах некоторые данные. Мне нужно среднее из каждых N строк одного (позже, вероятно, больше) столбцов данных. В качестве первого решения я бы попытался записать конкретное среднее значение рядом с N-й строкой в ​​качестве нового столбца, и просто не было записей для промежуточных строк (например, для N = 100: с 0-99 нет новых выходных данных, но в сотой строке я получаю среднее значение из последних 100 значений из выбранного столбца)

Моей конечной целью будет добавление вычисленных средних значений к каждой строке ceil (N / 2). Чтобы среднее значение для N = 100 было добавлено в 50-й строке.

Поскольку у меня ограниченные знания и ресурсы для решения этой проблемы, я мог бы просто запустить awk более одного раза и попытаться вывести свои результаты в сначала временный файл, а затем попытайтесь объединить его.

Большое спасибо!

PS: На самом деле это не должен быть только awk, я просто подумал, что это, вероятно, будет наиболее подходящим решением .

Редактировать: Мои данные выглядят так:

-9,787440e+00;1,8;29,2;0,0033;0,0405;-0,0006;0,0102
-9,787360e+00;-1,90735e-07;28,8;0,0017;0,0033;0,00012;-0,00956
-9,787280e+00;-1,90735e-07;29,4;0,0017;0,0405;0,00036;0,0102
-9,787200e+00;1,8;29;0,0033;0,0093;0,00156;-0,00764
-9,787120e+00;8;29,4;0,0093;0,0405;0,00316;0,0102
-9,787040e+00;15,6;29;0,0167;0,0129;0,00332;-0,00636

В первом столбце у меня есть отметки относительного времени, а другие значения являются измеренными значениями. Теперь скажем, для N = 3 мне нужны средние значения столбца 6 в новом столбце. Результат в идеале должен выглядеть следующим образом:

-9,787440e+00;1,8;29,2;0,0033;0,0405;-0,0006;0,0102
-9,787360e+00;-1,90735e-07;28,8;0,0017;0,0033;0,00012;-0,00956**;−0,00004**
-9,787280e+00;-1,90735e-07;29,4;0,0017;0,0405;0,00036;0,0102
-9,787200e+00;1,8;29;0,0033;0,0093;0,00156;-0,00764
-9,787120e+00;8;29,4;0,0093;0,0405;0,00316;0,0102**;0,00268**
-9,787040e+00;15,6;29;0,0167;0,0129;0,00332;-0,00636

Я пытался отметить вновь добавленные записи жирным шрифтом **. Таким образом, для N = 3 среднее значение каждых 3 строк столбца 6 следует добавлять в середине каждого окна усреднения. ceil (3/2) = 2 в данном случае в каждой второй строке после вычисления нового среднего.

Редактировать 2: мне удалось добавить вычисленное среднее значение для каждой N-й строки - теперь мне нужно сдвиньте назад N / 2 строки. Возможно ли это как-то с помощью awk или других bash инструментов? В целом это должно быть достаточно быстро - мне нужно go через 65 МБ файлов .csv. Большое спасибо!

BEGIN { 
N=3
OFS=FS = ";";
}

{ 
    sum+=$1
}

{
    if (NR%N==0) {
        my_add_col=sum/N
        sum=0
        $(NF+1)=my_add_col
    }
}

{
    print $0
}

1 Ответ

0 голосов
/ 25 февраля 2020

Позвольте мне предположить;

  • Десятичный разделитель - запятая.
  • Количество записей кратно N.

, тогда будет пожалуйста, попробуйте следующее:

LC_ALL=fr_FR.UTF-8 awk --use-lc-numeric -F";" -v N=3 '
    {
        sum += $6               # accumulate the value in the 6th field
        list[(NR-1)%N+1] = $0   # store current line in an array (to be displayed later)
    }
    NR%N==0 {                   # the line number is a multiple of N
        ave = sum / N
        ceil = int((N + 1) / 2) # the line to add the column of the average
        for (i = 1; i < ceil; i++) print list[i]
        print list[ceil] ";" ave
        for (i = ceil + 1; i <= N; i++) print list[i]

        sum = 0                 # initialize sum for the next iteration
        delete list             # initialize list of lines
    }
' data.txt
...