Нахождение медианы записей, определенных в файле - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть файл

try.txt

RAM 142 149 131
Cache 456 152 184

Я хочу вычислить maximum, minimum, median для каждого значения строки

Ожидаемый результат:

Min= 131 Max=149 Median=142
Min=152 Max=456 Median=184

Вот что я попробовал .:

for itr in {1..2}
do
awk "FNR == $itr { c=0;size=NF;
        for(i=2;i<=size;i++)
        arr[c++] =$i;

        for(i=0;i<c;i++)
        {
                for (j=i+1;j<c;j++)
                {
                    if(arr[i]>arr[j])
                    {
                        temp=arr[i];
                        arr[i]=arr[j];
                        arr[j]=temp;
                    }
                }
        }    

        print "Min=" arr[0] "Max=" arr[2] "Median=" arr[1]   
}" try.txt
done

Чтобы приблизиться к выводу, я создал массив для хранения значений $ 2, $ 3, $ 4 каждой строки, но, к сожалению, этоне принимает.Основная цель создания массива для вычисления медианы, так как элемент должен быть в отсортированном порядке для вычисления медианы.Пожалуйста, помогите мне в создании массива для значения каждой строки, чтобы вычислить мин, макс, медиана.

Ответы [ 4 ]

0 голосов
/ 14 февраля 2019

опоздал на вечеринку, а вот еще awk

$ awk '{$1=""; split($0,a); asort(a); 
        print "Min="a[1], "Max="a[3], "Median="a[2]}' file

Min=131 Max=149 Median=142
Min=152 Max=456 Median=184
0 голосов
/ 14 февраля 2019

Для ограниченного ввода, состоящего только из 3 чисел, мы могли бы:

cat <<EOF >file
LoginActivity 142 149 131
StorageCheckActivity 456 152 184
EOF

# remove the leading word
<file cut -d' ' -f2- | 
# for each 3 arguments, print them on separate line, sort them, remove newlines
xargs -n3 sh -c 'printf "%s\n" "$@" | sort | tr "\\n" " "' -- |
# for each of 3 arguments from the input, print them in nice formatting using printf
xargs -n3 sh -c 'printf "Min=%d Max=%d Median=%d\n" "$1" "$3" "$2"' -- 

выведет:

Min=131 Max=149 Median=142
Min=152 Max=456 Median=184
0 голосов
/ 14 февраля 2019

Просто для удовольствия, 3 сравнения:

awk '{ x=$2; y=$3; z=$4; }
     (x > y) {t=x;x=y;y=t}
     (y > z) {t=y;y=z;z=t}
     (x > y) {t=x;x=y;y=t}
     {print "Min="x" Max="z" Median="y}' file
0 голосов
/ 14 февраля 2019

Выполнение с помощью быстрого Perl-скрипта (который затем вызывается из сценария оболочки):

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;

while (<>) {
    chomp;
    my @nums = sort { $a <=> $b } (split)[1,2,3];
    say "Min=$nums[0] Max=$nums[2] Median=$nums[1]";
}

Пример:

$ ./example.pl try.txt
Min=131 Max=149 Median=142
Min=152 Max=456 Median=184

Или как однострочный:

$ perl -lane 'printf "Min=%d Max=%d Median=%d\n", (sort { $a <=> $b } @F[1,2,3])[0,2,1]' try.txt 
Min=131 Max=149 Median=142
Min=152 Max=456 Median=184

Но так как вы спросили, вот версия awk для gawk:

$ gawk '{
   arr[1] = $2; arr[2] = $3; arr[3] = $4;
   asort(arr, arr, "@val_num_asc");
   printf "Min=%d Max=%d Median=%d\n", arr[1], arr[3], arr[2];
  }' try.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...