3. Linux基础
做RNA-seq分析,说白了就是跟服务器打交道。我见过不少新手拿到服务器后,第一反应是打开图形界面,或者干脆买个云服务器配个桌面。嗯,这路子其实走偏了。如果你真想高效处理那些动辄几十GB的fastq文件,命令行才是你的主场。
这一章我不会给你从头讲Linux系统管理,那够写一本书了。我只讲做RNA-seq分析最常用的那套东西。你把这些用熟了,后面的分析流程才能跑得顺。
为什么必须用命令行?
RNA-seq的原始数据有多大?我举个例子。一个人类样本的双端测序,两个fastq文件加起来往往超过10GB。跑比对、定量、差异表达,哪个环节不得处理几个小时?
图形界面在这种场景下太慢了。而且你会发现,真正的生信工具——比如STAR、Salmon、DESeq2——它们就没有图形界面。你要用它们,就必须过命令行这一关。
ls、cd、grep、awk、sed这五个命令就跑通了第一个RNA-seq分析流程。先把这些练透,再谈其他的。连接服务器
你手头的Linux服务器是远程的,对吧?我们要用SSH连进去。命令很简单:
ssh username@your_server_ip
输入密码后,你就登陆到了服务器。这时候你看到的那个提示符,通常叫shell。它就是一个等待你输入命令的界面。
退出的时候打exit就行。我个人习惯每次连完服务器后,检查一下是否断开了连接,不然下次重连可能会提示端口被占用。这不算大问题,但挺烦人的。
文件系统——你得知道东西在哪儿
Linux的文件系统是一棵树,根是/。你想想看,一个典型的RNA-seq项目目录应该长什么样?我的经验是这样的:
project/
├── data/
│ ├── raw_fastq/
│ ├── trimmed_fastq/
│ └── alignment_bam/
├── scripts/
├── results/
│ ├── counts/
│ └── diff_expr/
└── logs/
这个结构看起来很清晰,对吧?但实际项目中我曾经见过有人把所有数据堆在/home/user/下面,文件名乱七八糟,过了三个月连自己都找不到东西在哪里。所以说,从一开始就养成好习惯非常重要。
/home/你的用户名/是你想待的地方。/tmp/有时候也用来放临时文件,但要注意它可能会被定期清理。常用命令——我先挑最重要的讲
命令太多,不可能一次全学完。我挑RNA-seq分析中出场频率最高的几个展开讲。
1. ls 和 cd
这两个命令是基础中的基础。ls列出当前目录下的文件和文件夹。cd切换目录。
ls
ls -l # 详细信息
ls -lh # 文件大小用人类可读的单位
ls -ltr # 按时间排序,最近的在最后
cd data/
cd .. # 返回上一级目录
cd ~ # 回到你的home目录
看下ls -lh的输出,那一长串像-rw-r--r--的东西是文件权限。左侧第一个字符是文件类型:-表示普通文件,d表示目录。后面九位分成三组,分别代表文件所有者、所在组、其他人的读(r)、写(w)、执行(x)权限。
做RNA-seq分析时,很多工具需要可执行权限。我遇到过一个情况:下载了STAR的二进制文件,但忘了给它加执行权限,结果跑分析时直接报错“Permission denied”。这个坑很简单,但很多人都会踩一次。
chmod +x 文件名。这条命令很常用,建议你牢牢记下来。2. grep——搜索之王
做RNA-seq分析,grep是你最强大的朋友。它能帮你在文件中快速查找特定内容。
grep "TP53" gene_expression.txt # 找含有TP53的行
grep -v "unmapped" alignment_summary.txt # 反向匹配(排除某词)
grep -c "ENSG" annotation.gtf # 统计匹配行数
grep -i "tumor" sample_info.txt # 忽略大小写
grep -n "FPKM" count_table.txt # 显示行号
在差异表达分析中,我经常用grep来快速检查某个基因的表达值。比如我怀疑BRCA1在某个样本中被异常沉默了,跑完定量后第一件事就是grep一下它的表达量。
grep默认不支持正则表达式的全量功能,比如扩展的正则语法需要加-E参数。我一开始用过grep "TP53\|BRCA1"想匹配两个基因,发现怎么也搜不到——就是因为没加-E。3. awk——文本处理的瑞士军刀
如果说grep是做筛选的,那awk就是做数据提取和格式转换的。它把文件按行分成记录,按空格或制表符分成字段,然后你可以对字段进行操作。
awk '{print $1}' sample_list.txt # 打印第一列
awk '$3 > 0.05 {print $1, $2}' diff_result.txt # 筛选p值大于0.05的基因
awk '{sum += $2} END {print sum}' counts.txt # 统计第二列总和
在RNA-seq分析中,awk最经典的场景就是处理表达矩阵或差异表达结果。我写过一个脚本,用awk从DESeq2的输出中快速筛选出padj小于0.05且log2FoldChange绝对值大于1的基因:
awk -F'\t' '$7 < 0.05 && ($3 > 1 || $3 < -1) {print $1}' deseq2_results.tsv
-F'\t'是指定分隔符为制表符,因为TSV文件是用Tab分隔的。$7是第7列(padj),$3是第3列(log2FoldChange)。
4. 其他命令快速过一遍
下面这些命令不详细展开了,但你一定要知道它们的存在:
| 命令 | 作用 | RNA-seq中的应用场景 |
|---|---|---|
head / tail | 查看文件头/尾 | 检查fastq文件的前几行,看格式是否正常 |
wc -l | 统计行数 | 统计fastq中有多少条read |
cut | 按列提取 | 从CSV中提取样本名称列 |
sort / uniq | 排序和去重 | 统计基因出现次数 |
sed | 流编辑器,替换文本 | 批量修改样本名或路径 |
sed的s/旧文本/新文本/g结构最常用。比如你在处理批量样本时,想将所有文件名中的_R1改为_forward,一条sed命令就搞定了。实战案例:查看一个fastq文件
说了这么多,不如直接拿一个fastq文件练手。fastq文件是Illumina测序的标准输出格式,每条read占4行。第一行以@开头,是序列标识符;第二行是碱基序列;第三行以+开头,有时重复标识符;第四行是质量分数。
我们试试:
# 查看前8行(两条read)
head -8 sample_1.fastq
# 输出示例:
@SRR123456.1 HWI-ST999:1:1101:1000:1000 length=101
ACGTACGTACGTACGTACGTACGTACGTACGTACGTACGTACGT
+
IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
# 统计一共有多少条read
echo $(cat sample_1.fastq | wc -l) / 4 | bc
# 或者用awk一步搞定
awk 'END {print NR/4}' sample_1.fastq
cat直接查看整个文件。那样你的终端会被刷屏,甚至可能导致连接中断。用head看个开头就够了。我的避坑指南
这些坑我基本都踩过,写出来帮你省点时间:
- 文件权限问题:我曾经因为没给输入文件加读权限,跑STAR时等了半个小时,结果报错退出,白白浪费了时间。每次提交任务前,务必先
ls -l检查文件权限。 - 路径写错:RNA-seq分析经常涉及多级目录。我建议把所有软件安装路径和项目路径写在一个配置文件中,比如
config.sh,然后通过source config.sh加载变量。这样不容易写错。 - 通配符的陷阱:
*.fastq会匹配所有以.fastq结尾的文件,但如果当前目录下有很多无关文件,可以把它们移到一个子目录中,避免误操作。 - 作业调度:如果你在集群上工作,用
qsub或sbatch提交作业,不要直接在登录节点上跑大任务。我有一个同事就是直接在登录节点上跑STAR,结果管理员警告信马上就到了。
rm命令里轻易使用-rf,尤其不要配合/*。我听说过有人在/目录下执行rm -rf .,直接把整个服务器删了。恢复数据几乎不可能。构建你自己的命令手册
最好的学习方式是边用边记。我建议你做一个小手册,把每次用到的命令和参数都写下来。下面是我个人笔记中的一个片段:
# 常用命令速查
# 查看文件大小
du -sh filename
# 解压gz文件
gunzip -k file.gz
# 统计某列的最大值
awk 'max < $2 {max = $2} END {print max}' data.txt
# 批量重命名
for f in *.txt; do mv "$f" "${f%.txt}.tsv"; done
# 后台运行并保存日志
nohup run_analysis.sh > analysis.log &
这个速查表我用了很久。每遇到一个新场景,我就加一条。现在我的笔记里有超过两百条命令,覆盖了从数据质控到最终可视化的全流程。
你看这张图,基本上就是我这章想说的全部内容。从SSH连接到文件系统,再到命令层面的ls、cd、grep和awk,最后是最佳实践——把这几部分串联起来,你就具备了处理RNA-seq数据的基本功。后面的章节我们会基于这些命令,真正开始跑差异表达分析。别急,一步一步来,先把基础打好。