我这里先抛出问题,我手上有套数据:包含三列,第一列ensgid、第二列symbol,第三列fpkm值。
问了老师,老师说相同的ensg对应的fpkm值,求均值。
所以针对上方数据要实现的是:根据第一列的ensgid分组,求fpkm的均值
解决代码
cat SRR192333_fpkm.txt |awk '{s[$1]+=$3;count[$1]+=1;gene[$1]=$2}END{for(i in s){print i,gene[i],s[i]/count[i]}}'>SRR192333_fpkmmean.txt
解析:
cat 文件名:读取数据
| :管道符,把|
前结果输出到|
后作为输入
awk:linux上与grep sed并称三神器,详细自查
$1
:指代第一列
$2
:指代第二列
>
输出符号,把前面的好结果,存到>
后面的文件里
cat SRR192333_fpkm.txt
:读取SRR192333_fpkm.txt文件
awk标准格式: awk{运算}END{结果输出}
awk '{s[$1]+=$3;count[$1]+=1;gene[$1]=$2}END{for(i in s){print i,gene[i],s[i]/count[i]}}'
-
s[$1]+=$3
相同ensg求和 -
count[$1]+=1
相同ensg计数 -
gene[$1]=$2
保存ensg的symbol -
for(i in s){print i,gene[i],s[i]/count[i]}
循环输出每个ensg的id,对应的symbol,以及均值 -
>SRR192333_fpkmmean.txt
将print的结果存进SRR192333_fpkmmean.txt里。
看看正确性,我输出和还有计数(第3,4列):看他们的商确实和上方结果一直
注:该代码简单修改后也可以用作计数,求和等