0

基本的に、私が取得しているファイルには、最初の 3 つの列が貼り付けられ、その後に空白行の列が続きます。これは、column4 に何も追加されていないように見えるためです。

コマンド置換で作成した変数を使用するべきではないように感じますが、そうでなければ必要なこれらの番号にどのようにアクセスするかわかりません

#!/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

不明な点がある場合は申し訳ありませんが、明確にするために最善を尽くしました。疑問に思っていることがあるかどうか尋ねてください。編集またはコメントします

ありがとうございました

4

2 に答える 2

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[5..@F])/(@F-6)'

も印刷します

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

平均と中央値両方を出力する場合 (要素の奇数または偶数)

perl -MList::Util=sum -lanE '
    @s = sort { $a <=> $b } @F[5..@F];
    $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;
}
于 2016-05-16T18:37:04.223 に答える