我写了一个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
)
答案 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