2016-05-16 5 views
0

В основном файл я получаю есть первые три колонн, вставленных в последующей колонке заготовок линий, так как это выглядит, как будто ничего выходит добавляется в column4подстановка команд в сценарии оболочки с переменными оболочками внутри замещения

I чувствую, что я, вероятно, не следует использовать переменные, которую я создал в подстановке команд, но я не уверен, как бы я получить доступ к этим номера, которые мне нужно иначе

#!/bin/sh # the first file in the expression of a bunch of patients to be made into data files that can be put into the graph 
awk '{print "hs"$1,"\t",$2,"\t",$3}' $1 > temp1.txt  #important columns saved 
numLines=`wc -l $1`  
touch column4.txt  #creates a column for the average of column 6- 
for ((s=0;s<$numlines;s++)); do     
     currentRow=0       #Will eventually be the average of column 6- for the row of focus 
     for ((i=6;i<=106;i++)); do    
       addition=`cut -f $i $1 | head -n $s | tail -n 1`  # cuts out the number at the row and column of focus for this loop 
       currentRow=`expr $currentRow + $addition`    # adding the newly extracted number to the total 
     done 
     currentRow=`expr $currentRow/101`       #divides so the number is an average instead of a really big number 
     echo $currentRow >> column4.txt         #appends this current row into a text file that can be pasted onto the first three columns 
done 
paste temp1.txt column4.txt 
rm temp1.txt column4.txt 

, если это помогает входной файл очень большой (около 106 столбцов и десятков тысяч строк), но вот пример того, как он выглядит:

Important identifier line grant regis 76 83 02 38 0 38 29 38 48 (..up to to 106 columns) 
another important identifier bill susan 98 389 20 29 38 20 94 29 0 (.. same point) 

И тогда результат будет выглядеть как (предполагая, что мы исключаем столбцы после ..)

Important identifier line 34.88 
another important identifier 79.67 

Извините, если что-то неясно, старался изо всех сил, чтобы сделать это ясно, просто спросить, есть ли что-то вам задаетесь вопросом о том, и я буду редактировать или комментировать

благодарственные

+2

В назначениях удалите '$' с левой стороны. – choroba

+0

Конечно, спасибо, это не исправило проблему, поэтому я отредактировал их, потому что я пытаюсь выяснить что-то еще с этим вопросом, но спасибо за вашу помощь! – Jacob

+1

'numlines' - это не то же самое, что' numLines'. – choroba

ответ

0

awk на помощь!

вы можете заменить все с этим сценарием, используя значения на входе образца

$ awk '{for(i=6;i<=NF;i++) sum+=$i; 
     printf "%s %s %s %.2f\n", $1,$2,$3, sum/(NF-5); 
     sum=0}' file 

Important identifier line 39.11 
another important identifier 79.67 

для медианы (нечетное число полей) вы можете сделать это

$ awk '{for(i=6;i<=NF;i++) a[i-5]=$i; 
     asort(a); 
     mid=(NF-4)/2; print mid, a[mid]}' file 

5 38 
5 29 

для четного числа, то общий подход - это усреднение соседних чисел (может быть также взвешенно средним по расстоянию).

+0

Thank-you @karakfa! Я даже не знал, что awk может это сделать, знаете ли вы где-нибудь, что хорошо узнать немного больше об awk? Я изучил его в течение нескольких часов на одном из моих занятий, но мне кажется, что я хотел бы узнать больше о его способностях. – Jacob

+0

Также! Есть ли способ получить медиану с этим? – Jacob

0

Вы можете попробовать использовать следующие:

perl -MList::Util=sum -lanE '@n=grep{/^\d+$/}@F; say "@F[0..4] ",sum(@n)/@n' 

принты:

Important identifier line grant regis 39.1111111111111 
another important identifier bill susan 79.6666666666667 

или для с точностью

perl -MList::Util=sum -lanE '@n=grep{/^\d+$/}@F; printf "@F[0..4] %.2f\n",sum(@n)/@n' 

Important identifier line grant regis 39.11 
another important identifier bill susan 79.67 

выше вычисляет среднее для всех числовых значений в линия. Для точного 6- можно использовать, например:

perl -MList::Util=sum -lanE 'say "@F[0..4] ",sum(@F[[email protected]])/(@F-6)' 

также печатает

Important identifier line grant regis 39.1111111111111 
another important identifier bill susan 79.6666666666667 

для печати как, то средней и медианного (нечетного или даже Num элементов)

perl -MList::Util=sum -lanE ' 
    @s = sort { $a <=> $b } @F[[email protected]]; 
    $m = int(@s/2); 
    printf "@F[0..4] %.2f %d\n", 
    sum(@s)/(@s-1), 
    (@s % 2) ? @s[$m] : sum(@s[$m-1,$m])/2 
' filename 

отпечатки:

Important identifier line grant regis 39.11 38 
another important identifier bill susan 79.67 29 

и, наконец, то же, что и выше, - как скрипт perl с хорошими переменными.

use strict; 
use warnings; 
use List::Util qw(sum); 

while(<>) { 
    chomp; 
    my(@text) = split; 
    my(@sorted_numbers) = sort { $a <=> $b } grep { /^\d+$/ } splice @text, 5; 

    my $average = sum(@sorted_numbers)/@sorted_numbers; 

    my $median; 
    my $mid = int(@sorted_numbers/2); 

    if(@sorted_numbers % 2) { 
     $median = $sorted_numbers[$mid]; 
    } else { 
     $median = sum(@sorted_numbers[$mid-1,$mid])/2; 
    } 
    printf "@text %.2f %d\n", $average, $median; 
}