拿到一张几万行的 count 表,想抽某几列、按某列排序、统计某列各类别有多少个——这些日常操作,cut、sort、uniq 三个小命令组合起来就能全包。它们各管一摊:cut 取列、sort 排序、uniq 去重计数,用管道一串,复杂统计也能一行写完。这是 Linux 文本处理里最经典的三件套,几乎天天用。这一讲把三件套的常用法一次理清:cut 取列、sort 各种排序、uniq 去重计数,以及它们组合成的统计流水线。
三件套各管一摊
cut 负责按列裁剪、sort 负责排序、uniq 负责去重和计数。关键是 uniq 只能去掉相邻的重复行,所以几乎总要先 sort 再 uniq。三个用管道一串,就是大表统计的万能组合。
核心命令速查
下面按「cut 取列 / sort 排序 / uniq 去重计数 / 组合统计」分组,示例 count 表在 testdata 里:
#!/bin/bash# cut / sort / uniq 处理大表常用命令速查,按需复制F=testdata/counts.tsv# ---- cut 取列 ----cut -f1 "$F"# 取第 1 列cut -f1,3 "$F"# 取第 1、3 列cut -f2- "$F"# 第 2 列到末尾cut -f1-2 "$F"# 第 1 到 2 列cut -d, -f1 file.csv # CSV 用逗号分隔cut -c1-5 "$F"# 按字符位置切# ---- sort 排序 ----sort"$F"# 默认字典序sort -r "$F"# 倒序sort -t$'\t' -k2,2n "$F"# 按第 2 列数值升序sort -t$'\t' -k2,2nr "$F"# 按第 2 列数值降序sort -t$'\t' -k3,3 -k2,2nr "$F"# 先按第3列、再按第2列数值sort -u "$F"# 排序同时去重# ---- uniq 去重 / 计数 ----sort"$F" | uniq# 去重(uniq 只去相邻,先 sort)cut -f3 "$F" | tail -n +2 | sort | uniq -c # 统计各类型次数cut -f3 "$F" | tail -n +2 | sort | uniq -c | sort -rn # 按次数排序cut -f3 "$F" | tail -n +2 | sort | uniq -d # 只看出现重复的cut -f3 "$F" | tail -n +2 | sort | uniq -u # 只看唯一的# ---- 组合:常见统计 ----wc -l "$F"# 数行数sort -t$'\t' -k2,2nr "$F" | head -3 # count 最高的前 3 行sort -t$'\t' -k2,2nr "$F" | head -3 | cut -f1 # top3 的基因名
cut -f 取列、-d 改分隔符;sort -k2,2nr 按第2列数值倒序;uniq -c 计数、-d 看重复、-u 看唯一。
示例的输出日志
对示例 count 表跑几个代表命令,结果如下:
--- 取第1、3列 ---gene typeTP53 protein_codingEGFR protein_codingMALAT1 lncRNAKRAS protein_codingNEAT1 lncRNAMYC protein_codingXIST lncRNABRCA1 protein_coding--- 按 count 降序 ---MALAT1 980 lncRNANEAT1 410 lncRNATP53 320 protein_codingMYC 260 protein_codingEGFR 150 protein_codingBRCA1 130 protein_codingKRAS 88 protein_codingXIST 75 lncRNAgene count type--- 各类型计数 --- 5 protein_coding 3 lncRNA--- count 最高前3 ---MALAT1 980NEAT1 410TP53 320OK
抽出的列、按 count 倒序的排名、各类型计数(5 个 protein_coding、3 个 lncRNA)——管道一串全出来。
扩展:完整统计流水线
三件套最常和管道一起用,串起来就是一条完整的统计流水线:
# 取类型列→跳表头→统计各类型→按数量排序cut -f3 testdata/counts.tsv | tail -n +2 | sort | uniq -c | sort -rn# 找 count 最高的前 3 个基因及其数值sort -t$'\t' -k2,2nr testdata/counts.tsv | head -3 | cut -f1,2
tail -n +2 跳表头;管道把小命令串成流水线,是 Linux 文本处理的精髓。
避坑指南
- uniq 没去干净 → uniq 只去相邻重复,必须先 sort
- 数字排序变乱 → 加
-n(按数值),默认是字典序 - cut 分隔符不对 → 默认是 tab,CSV 要
-d, - 想按多列排 →
sort -k1,1 -k2,2n 主次键分开写
📦 完整代码 + 测试数据下载
百度网盘链接:https://pan.baidu.com/s/1DWgC5cgQMDudA40hq1ewKQ?pwd=l07c
提取码:l07c(代码已实测可直接运行,建议保存到自己网盘)