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

我假设在第一行数据之前有两行,所以我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 回答