为列中的每个唯一字段迭代awk函数

时间:2013-06-22 17:59:45

标签: awk

我写了一个awk脚本来分析我的表数据 - 我正在计算p值和log2比值比。
这是我的数据表的一个例子。

Label      Value1     Value2      

Label1       9          6
Label1       7          6 
Label1       1          6
Label2       5          7
Label2       3          7
Label2       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 Label1

Column1是p值;第2列是比值比;第3列是Label。

问题是我不知道如何对Labels应用这个计算 - 我只得到第一个的结果。

我的问题是 - 如何为第1列中的每个唯一字段迭代此类awk函数(Label1/2

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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