几万行的表达矩阵,想按列求个和、按条件筛几行、算个均值——打开 Excel 直接转圈卡死,写 Python 又嫌重。这种结构化大表,awk 一行命令就能搞定,还能随手接进管道。awk 把每行按列拆开,你只管说对第几列做什么,它逐行扫一遍就出结果,几个 G 的文件也不在话下,还能随手接进管道。这一讲把 awk 在生信表格里的常用法一次理清:看结构、取列取行、按条件过滤、列方向统计、行方向计算、计数。
awk 的基本套路
awk 把每行自动按分隔符切成 2…,核心就一句:对满足条件的行,对某些列做点什么。NR 是行号、NF 是列数,记住这两个变量,日常表格处理就够用了。
核心命令速查
下面按「看结构 / 取列取行 / 过滤 / 列统计 / 行计算 / 计数」分组,配套小矩阵在 testdata 里:
#!/bin/bash# awk 处理表达矩阵常用命令速查,按需复制TSV=testdata/expr.tsv# ---- 看结构 ----awk 'END{print NR}'"$TSV"# 总行数awk -F'\t''NR==1{print NF}'"$TSV"# 列数awk -F'\t''NR<=3'"$TSV"# 看前 3 行# ---- 取列 / 取行 ----awk -F'\t''{print $1}'"$TSV"# 取第 1 列awk -F'\t''{print $1,$3}'"$TSV"# 取第 1、3 列awk -F'\t''$1=="GENE05"'"$TSV"# 按值匹配某行awk -F'\t''/GENE0/'"$TSV"# 正则匹配行# ---- 按条件过滤 ----awk -F'\t''NR>1 && $2>200'"$TSV"# 第2列>200awk -F'\t''NR>1 && $2>100 && $3>100'"$TSV"# 多条件awk -F'\t''NR==1 || $2>200'"$TSV"# 保留表头再过滤# ---- 列方向统计 ----awk -F'\t''NR>1{s+=$2} END{print s}'"$TSV"# 单列求和awk -F'\t''NR>1{s+=$2} END{print s/(NR-1)}'"$TSV"# 单列均值awk -F'\t''NR>1{for(i=2;i<=NF;i++)c[i]+=$i} END{for(i=2;i<=NF;i++)print "col"i,c[i]}'"$TSV"# 各列求和awk -F'\t''NR>1{if($2>max){max=$2;g=$1}} END{print "最高:",g,max}'"$TSV"# 找最大值所在行# ---- 行方向计算 ----awk -F'\t''NR>1{sum=0;for(i=2;i<=NF;i++)sum+=$i; print $1,sum/(NF-1)}'"$TSV"# 每个基因均值awk -F'\t''BEGIN{OFS="\t"} NR>1{print $1,$2+$3+$4}'"$TSV"# 新增合计列awk -F'\t''NR>1{m=$2;for(i=3;i<=NF;i++)if($i>m)m=$i; print $1,m}'"$TSV"# 每行最大值# ---- 计数 ----awk -F'\t''NR>1{n++} END{print "基因数:",n}'"$TSV"# 数据行计数awk -F'\t''NR>1 && $2>200{n++} END{print n+0}'"$TSV"# 满足条件的行数
-F'\t' 指定制表符;s[i] 按列下标累加,END 块扫完所有行后统一输出;OFS 设输出分隔符。
示例的输出日志
对示例矩阵跑几个代表命令,结果如下:
行数:13列数:4第2列>200的基因:GENE02 333GENE03 274GENE04 298GENE06 222GENE08 217GENE10 321GENE11 295各列求和:col2 2445col3 1311col4 1914前3个基因均值:GENE01 148GENE02 131.333GENE03 169.667OK
行列数、过滤结果、三列总和、前几个基因的均值——一行 awk 全部算出,秒级完成。
扩展:分组统计与拆文件
用关联数组能做分组统计,还能按某列把大表拆成多个文件:
# 按高低表达分组,对第3列求和awk -F'\t''NR>1{g=($2>200?"high":"low"); s[g]+=$3} END{for(k in s)print k,s[k]}' testdata/expr.tsv# 按基因名把矩阵拆成多个文件awk -F'\t''NR>1{print > ("gene_"$1".txt")}' testdata/expr.tsv
分组统计、按键拆文件,是 awk 比 cut/grep 强的地方。
避坑指南
- 输出粘在一起 → 用
printf 或设 OFS 控制分隔 - 中文/特殊分隔 → 显式写
-F'\t',别靠默认空白 - 大文件别
cat file | awk → 直接 awk ... file
📦 完整代码 + 测试数据下载
百度网盘链接:https://pan.baidu.com/s/1GYM5gdfVtSKRnvkQhGHk5A?pwd=l05c
提取码:l05c(代码已实测可直接运行,建议保存到自己网盘)