3.1 正则表达式
正则表达式 (regular expression) 是用来做模糊匹配的,匹配符合特定模式的文本。最早来源于 Unix 系统中的 sed 和grep 命令,在各个程序语言,如 perl, python 中也都有实现。不同程序语言中正则表达式语法大体通用,细节上又各自有自己的特色。
3.2 awk 命令
3.2.1 awk 基本参数解释
awk 擅长于对文件按行操作,每次读取一行,然后进行相应的操作。
awk 读取单个文件时的基本语法格式是 awk 'BEGIN{OFS=FS="\t"}{print 1;}' filename。
读取多个文件时的语法是 awk 'BEGIN{OFS=FS="\t"}ARGIND==1{print 1;}ARGIND==2{print 0 表示一行内容;2, … 1]=1: 索引操作,类似于 python 中的字典,在 ID map,统计中有很多应用。
计算某列内容出现的次数。##
ct@ehbio:~/sxbd$ cat count
ID Type
Pou5f1 Pluripotency
Nanog Pluripotency
Sox2 Neuron
Tet1 Epigenetic
Tet3 Epigenetic
Myc Oncogene
ct@ehbio:~/sxbd$ awk 'BEGIN{OFS=FS="\t"}{if(FNR>1) a[$2]+=1;}END\
{print "Type\tCount"; for(i in a) print i,a[i];}' count
Type Count
Neuron 1
Epigenetic 2
Oncogene 1
Pluripotency 2
ct@ehbio:~/sxbd$ tail -n +2 count | cut -f 2 | sort | uniq -c
2 Epigenetic
1 Neuron
1 Oncogene
2 Pluripotency
从 GTF 文件中提取启动子区域##
测试文件:ftp://ftp.ensembl.org/pub/release-91/gtf/homo_sapiens/Homo_sapiens.GRCh38.91.gtf.gz
sed 's/"/\t/g' GRCh38.gtf | \
awk 'BEGIN{OFS=FS="\t"}{if($3=="gene") {ensn=$10; symbol=$16; \
if($7=="+") {start=$4-1; up=start-1000; if(up<0) up=0; dw=start+500; \
print $1,up, dw, ensn, symbol, $7;} else \
if($7=="-") {start=$5-1; up=start+1000; dw=start-500; \
if(dw<0) dw=0; print $1,dw,up,ensn,symbol,$7}}}' | sort -k1,1 -k2,2n \
>GRCh38.promoter.bed
数据矩阵的格式化输出##
ct@ehbio:~/sxbd$ cat numeric.matrix
ID A B C
a 1.002 1.234 1.999
b 2.333 4.232 0.889
ct@ehbio:~/sxbd$ awk '{if(FNR==1) print $0; \
else {printf "%s%s",$1,FS; for (i=2; i<=NF; i++) \
printf "%.1f %s", $i, (i==NF?RS:FS)}}' numeric.matrix
ID A B C
a 1.0 1.2 2.0
b 2.3 4.2 0.9
3.3 SED 命令
3.3.1 sed 基本参数解释
sed 是 stream editor 的简称,擅长对文件进行各种正则操作、插入操作、替换操作和删除操作,可以全局,可以指定特定范围的行或者特定特征的行。
s/pat/replace/: 正则替换
前插行 i, 后插行 a, 替换行 c, 删除行 d, 输出行 p
N: 读入下一行,同时存储;n: 读入下一行,抛弃当前行
3.3.2 常见操作
• 替换特定的文本
# 一次替换
ct@ehbio:~/sxbd$ sed 's/ /_/' mat
ID 2_cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# 全部替换
ct@ehbio:~/sxbd$ sed 's/ /_/g' mat
ID 2_cell 4_cell 8_cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
• 获得逗号分隔的一组数
ct@ehbio:~/sxbd$ echo `seq 1 10` | sed 's/ /,/g'
1,2,3,4,5,6,7,8,9,10
• 针对指定行替换
ct@ehbio:~/sxbd$ sed '2,$ s/_[0-9]//g' mat
ID 2 cell 4 cell 8 cell embryo
Pou5f1 2 3 4 5
Nanog 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1 2 3 4 5
• 替换特定出现位置
# 替换第一个空格
ct@ehbio:~/sxbd$ sed 's/ /_/1' mat
ID 2_cell 4 cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# 替换第二个空格
ct@ehbio:~/sxbd$ sed 's/ /_/2' mat
ID 2 cell 4_cell 8 cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
# 替换第二个及以后的空格
ct@ehbio:~/sxbd$ sed 's/ /_/2g' mat
ID 2 cell 4_cell 8_cell embryo
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
c-Myc 2 3 4 5
Tet1_3 2 3 4 5
• 给序列起名字
ct@ehbio:~/sxbd$ cat seq
ACDGTFGGCATGCDTGD
ACDGAGCDTAGCDGTA
CAGDTAGDCTADTG
ct@ehbio:~/sxbd$ sed = seq
1
ACDGTFGGCATGCDTGD
2
ACDGAGCDTAGCDGTA
3
CAGDTAGDCTADTG
# 同时缓冲两行,但只对第一行行首操作
ct@ehbio:~/sxbd$ sed = seq | sed 'N;s/^/>/;'
>1
ACDGTFGGCATGCDTGD
>2
ACDGAGCDTAGCDGTA
>3
CAGDTAGDCTADTG
• 给文件增加标题行
ct@ehbio:~/sxbd$ tail -n +2 mat | sort -k2,2n
c-Myc 2 3 4 5
Nanog_1 2 3.2 4.3 5
Pou5f1_1 2 3 4 5
Tet1_3 2 3 4 5
# 1 表示第一行
# i 表示插入,在指定行前面插入新行
ct@ehbio:~/sxbd$ tail -n +2 mat | sort -k2,2n | sed '1 i ID\t2_cell\t4_cell\t8_cell\tembryo'
ID 2_cell 4_cell 8_cell embryo
c-Myc 2 3 4 5
Nanog_1 2 3.2 4.3 5
Pou5f1_1 2 3 4 5
Tet1_3 2 3 4 5
• 提取特定或指定范围的行
# -n 是必须的,阻止程序自动输出匹配行,不然会导致重复输出
sed -n '2,4p' mat #提取输出第二行到第四行
sed -n '4p' mat #提取输出第四行
• 提取符合特定模式的行
ct@ehbio:~/sxbd$ sed -n '/_/ p' mat
Pou5f1_1 2 3 4 5
Nanog_1 2 3.2 4.3 5
Tet1_3 2 3 4 5
ct@ehbio:~/sxbd$ sed -n '/-/ p' mat
c-Myc 2 3 4 5
• 去除文件中的空行
sed '/^$/d' # 空行就是只有行首和行尾的行
• 删除指定范围的行
sed '2,3d'
• 奇偶数行处理
ct@ehbio:~/sxbd$ echo -e "odd\neven\nodd\neven"
odd
even
odd
even
# 取出偶数行
ct@ehbio:~/sxbd$ echo -e "odd\neven\nodd\neven" | sed -n 'n;p'
even
even
# 取出奇数行
# 先都读进去,然后替换偶数行为空值,再输出
ct@ehbio:~/sxbd$ echo -e "odd\neven\nodd\neven" | sed -n 'N;s/\n.*//;p'
odd
odd
• Windows/Linux 换行符困境
Windows 下的换行符是\r\n, Linux 下换行符是\n, MAC 下换行符是\r。所以Windows 下的文件拷贝到 Linux 后,常会出现行尾多一个 ˆM 符号的情况,从而引起匹配或其它解析问题。
ct@ehbio:~/sxbd$ cat -A windows.txt
ID^M$
A^M$
B^M$
C^M$
ct@ehbio:~/sxbd$ sed 's/^M//' windows.txt | cat -A
ID$
A$
B$
C$
• sed 中使用 bash 变量
ct@ehbio:~/sxbd$ bash_variable='ehbio'
ct@ehbio:~/sxbd$ echo "sheng xin bao dan " | sed "s/$/$bash_variable/"
sheng xin bao dan ehbio
文章来源:生信宝典