Вы можете сделать это, используя awk
и gnuplot
. Предположим, что данные вашего примера (без mean
строк) находятся в data.txt
. Затем вы можете вычислить среднее значение в каждом столбце, начиная со второго столбца (от i=2
), а второй ряд (запись или строка, № 1 - NR==1
-> не суммировать, а заполнять вспомогательный массив a
с нулями: a[i]=0.0
) , С этой целью можно было использовать awk
условие: if (NR==1)... else {...calculate the means...}
. Awk
считывает данные по строкам. В каждой строке, вы итерацию над полями и суммировать данные из столбца с номером i
в массив элемент a[i]
:
{for(i=2;i<=NF;i++) a[i]+=$i;}
При итерации по первой строке (NR==1
), мы бы; В END
сценария awk
(все строки обработаны) просто разделите число столбцов в ваших данных NF-1
, чтобы рассчитать средние значения. Обратите внимание, что приведенный ниже код предполагает, что у вас есть данные в прямоугольном формате (NF
= const).
Кроме того, за исключением меток строк столбцов в label
массива: if (NR==1) {for(i=2;i<=NF;i++) label[i]=$i; ... }
Затем распечатать этикетки и средних значения в строки, по одной строке для одной этикетки.
for(i=2;i<=NF;i++) {printf label[i]" "; print a[i]/(NF-1)}
В последней таблице данных будет выглядеть таким образом:
1 15500000
2 22000000
3 28080000
4 75660000
5 123000000
Тогда вы могли бы сюжет один столбец против другого. Обратите внимание, что окончательные данные для gnuplot должны быть отформатированы в столбцах, а не в строках. Следующий код выполняет описанные операции:
gnuplot> unset key
gnuplot> plot "<export LC_NUMERIC=C; awk '{if (NR==1) {for(i=2;i<=NF;i++) label[i]=$i; a[i]=0.0;} else {for(i=2;i<=NF;i++) a[i]+=$i;};} END {for(i=2;i<=NF;i++) {printf label[i]\" \"; print a[i]/(NF-1)}};' data.txt"
отметить, что пространства должны быть экранированы с обратными косыми чертами \
в gnuplot
.