Как рассчитать среднее в Linux? - PullRequest
0 голосов
/ 26 ноября 2011

Как рассчитать среднее в linux?

I have a file like this:
ID          Math       Sci        Eng         Average
230          70         -          50
123          50         50         60
223          -          80         90

Мне нужен вывод, как это:

ID          Math       Sci        Eng         Average
230          70         -          50            60
123          50         50         60            53.33
223          -          80         90            85

Я использую этот код, но могу получить только общую сумму:

awk '/^[0-9]/ {for (i=2; i<=NF; i++) {tot+=$i}; avg=tot/cnt[i]; print $1 "\t" avg}'

Я рассчитал сумму, используя вышеприведенное; и подумал, что я смогу считать нет. но это дает мне ошибку .. Пожалуйста, помогите мне, я новичок в этой области .. Спасибо:)

Ответы [ 3 ]

1 голос
/ 26 ноября 2011
awk '/^[0-9]/ {
    tot = 0; 
    count = 0; 
    for (i = 2; i <= NF; i++) {
        to += $i; 
        if($i + 0 == $i){
           count++;
        }
    }
    avg = tot/count; 
    print $0,avg; 
}'

Может быть, лучше поместить это в сценарий.

0 голосов
/ 26 ноября 2011

AWK Скрипт:

awk '
/^[0-9]/{
            total=0;
            count=0;
            for(i=2;i<=NF;i++)
            {
                total=total+$i; 
                if($i!="-") 
                {
                    count++;
                }
             }
            print $0"\t\t" total/count
         }
!/[0-9]/{
            print $0;
            next
         }' avg.txt 

Тест:

[jaypal~/Temp]$ cat avg.txt 
ID          Math       Sci        Eng     Average
230          70         -          50
123          50         50         60
223          -          80         90

[jaypal:~/Temp] awk '
/^[0-9]/{
            total=0;
            count=0;
            for(i=2;i<=NF;i++)
            {
                total=total+$i; 
                if($i!="-") 
                {
                    count++;
                }
             }
            print $0"\t\t" total/count
         }
!/[0-9]/{
            print $0;
            next
         }' avg.txt 
ID          Math       Sci        Eng     Average
230          70         -          50       60
123          50         50         60       53.3333
223          -          80         90       85
0 голосов
/ 26 ноября 2011

в рубине:

filename = '/tmp/input'
outfile = '/tmp/output'

first = true
out = File.open(outfile, 'w')
File.readlines( filename ).each do |line|
  arr = line.split
  if first
    out.puts line
    first = false
  else
    sum = 0
    arr[1..3].each{|x| sum += x.to_i }
    denom = arr[1..3].count{|x| x =~ /\d+/ }
    avg = sum  /  denom.to_f
    arr << avg

    out.puts arr.join(' '*10)
  end
end
out.close
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...