- 36.《Bioinformatics Data Skills》之
- 28.《Bioinformatics-Data-Skills》之
- 18.《Bioinformatics-Data-Skills》之
- 19.《Bioinformatics-Data-Skills》之
- 【shell笔记>生信|专项】生信数据处理技能手札(3):
- Bioinformatics Data Skills
- 17.《Bioinformatics-Data-Skills》之
- 25.《Bioinformatics-Data-Skills》之
- 25.《Bioinformatics-Data-Skills》之
- 23.《Bioinformatics-Data-Skills》之
Unix命令和管道符号由于不在磁盘上进行读写操作,极大地提高的速度。今天介绍一个新命令sed
,它最流行的使用场景是进行文本的替换,方便快速。
例如将chroms.txt
文本(如下)出现的染色体名字chrom替换为chr:
$ cat chroms.txt
chrom1 3214482 3216968
chrom1 3216025 3216968
chrom1 3216022 3216024
chrom1 3671349 3671498
chrom1 3214482 3216021
chrom1 3466587 3513553
chrom1 3466587 3513553
chrom1 3466587 3466687
chrom1 3513405 3513553
chrom1 3783876 3783933
$ sed 's/chrom/chr/' chroms.txt
chr1 3214482 3216968
chr1 3216025 3216968
chr1 3216022 3216024
chr1 3671349 3671498
chr1 3214482 3216021
chr1 3466587 3513553
chr1 3466587 3513553
chr1 3466587 3466687
chr1 3513405 3513553
chr1 3783876 3783933
sed
文本替换采用正则表达式,形式为s/match/replace/
。默认每行替换第一次出现的匹配,如果想要全局替换的话在末尾加g
(即s/match/replace/g
),忽略大小写的话加i
。默认使用基础正则表达式,通过参数-E
使用扩展的正则表达式:
$ echo "chr1:28427874-28425431" | sed -E 's/^(chr[^:]+):([0-9]+)-([0-9]+)/\1\t\2\t\3/'
chr1 28427874 28425431
sed
默认的行为是输出匹配替换后的结果,但是如果没有匹配到内容的话则会输出整行内容:
$ grep -v "^#" Mus_musculus.GRCm38.75_chr1.gtf | sed -E 's/.*transcript_id "([^"]+)".*/\1/' | head -n3
1 pseudogene gene 3054233 3054733 . + . gene_id "ENSMUSG00000090025"; gene_name "Gm16088"; gene_source "havana"; gene_biotype "pseudogene";
ENSMUST00000160944
ENSMUST00000160944
通过增加-n
参数,并且在正则表达式结尾添加p
保证只输出匹配替换行的结果:
$ grep -v "^#" Mus_musculus.GRCm38.75_chr1.gtf | sed -E -n 's/.*transcript_id "([^"]+)".*/\1/p' | head -n3
ENSMUST00000160944
ENSMUST00000160944
ENSMUST00000082908
注意上面的命令采用了"([^"]+)"
的形式保证非贪婪匹配,如果换成"(.*)"
会变成贪婪匹配,导致如下后果:
$ echo 'transcript_id "ENSMUST00000160944"; gene_name "Gm16088"' | sed -E -n 's/.*transcript_id "(.*)".*/\1/p'
ENSMUST00000160944"; gene_name "Gm16088
上面的结果过度匹配了,所以匹配引号等配对出现的符号里面的内容时可以采用非贪婪匹配的形式避免出错。
sed
也可以直接输出指定范围行的内容:
$ sed -n '10,15p' mm_gene_names.txt
1700019A02Rik
1700019D03Rik
1700019O17Rik
1700022P22Rik
1700025G04Rik
1700034H15Rik
总的来说,sed
最常见的用法是替换文本,如果需要更加复杂的处理,与其编写复杂的sed
脚本,不如通过R或者Python实现方便。
网友评论