0

テーブルデータを分析する awk スクリプトを作成しました - p 値と log2 オッズ比を計算しています。
これは私が持っているデータテーブルの例です。

ラベル 値1 値2      

ラベル1 9 6
ラベル1 7 6
ラベル1 1 6
ラベル2 5 7
ラベル2 3 7
ラベル2 8 7

すべてのラベル ( Label1/2) について、観察された回数を数えvalue1 > value2、この回数を合計回数で割りますLabel- p 値を取得しています。
これに加えて、log2 比を比較します。
これは私の awk スクリプトです。

 awk '{a[$1]=$1}; ($2>=$3) {c++}; {sum+=$2} END 
      {print c/NR,log($3/(sum/NR))/log(2),a[$1]}'

そして、これは私が得た結果です

0.666667 0.0824622 ラベル 1

Column1 は p 値です。列 2 はオッズ比です。列 3 はラベルです。

問題は、この計算を両方に適用する方法がわからないことLabelsです-最初の計算に対してのみ結果が得られます。

私の質問は-列1のすべての一意のフィールドに対してそのようなawk関数を反復する方法です( Label1/2)

4

2 に答える 2

0

データの最初の行の前に 2 行あると想定しているのでNR、3 と比較します。プログラムは以前のラベル名を保存し ( $1)、変更された場合 ( ) にのみ$1 != label計算を実行して出力します。その他の条件 ( NR >= 3) は、同じラベルを処理している間のみデータを保存します。

awk '
    NR == 3 { label = $1 }
    NR >=3 && $1 != label { 
        printf "%.6f %.6f %s\n", c/l, log( v / (sum/l) ) / log(2), label
        c = l = sum = 0
        label = $1
    }
    NR >= 3 {
        if ( $2 >= $3 ) { c++ }
        l++
        sum += $2
        v = $3
    }
    END {
        printf "%.6f %.6f %s\n", c/l, log( v / (sum/l) ) / log(2), label
    }
' infile

次の結果が得られます。

0.666667 0.082462 Label1
0.333333 0.392317 Label2
于 2013-06-22T18:30:07.383 に答える
0

別の方法awk(配列を使用):

awk '
NR>1 && $2>$3 {
    times[$1]++
} 
{
    total[$1]+=$2;
    col3[$1]=$3;
    seen[$1]++
}
END {
    for(label in times) {
        print times[label]/seen[label],log(col3[label]/(total[label]/seen[label]))/log(2),label
    }
}' inputFile

出力:

0.666667 0.0824622 Label1
0.333333 0.392317 Label2
于 2013-06-22T19:15:04.653 に答える