linux查漏补缺 3

3.1 正则表达式

正则表达式 (regular expression) 是用来做模糊匹配的,匹配符合特定模式的文本。最早来源于 Unix 系统中的 sed 和grep 命令,在各个程序语言,如 perl, python 中也都有实现。不同程序语言中正则表达式语法大体通用,细节上又各自有自己的特色。


正则表达式基本语法 1

2

3

3.2 awk 命令

3.2.1 awk 基本参数解释

awk 擅长于对文件按行操作,每次读取一行,然后进行相应的操作。
awk 读取单个文件时的基本语法格式是 awk 'BEGIN{OFS=FS="\t"}{print 0,1;}' filename。
读取多个文件时的语法是 awk 'BEGIN{OFS=FS="\t"}ARGIND==1{print 0,1;}ARGIND==2{print 0;}' file1 file2。 awk 后面的命令部分是用引号括起来的,可以单引号,可以双引号,但注意不能与内部命令中用到的引号相同,否则会 导致最相邻的引号视为一组,引发解释错误。引号不可以嵌套 • OFS: 文件输出时的列分隔符 (output field separtor) • FS: 文件输入时的列分隔符 (field separtor) • BEGIN: 设置初始参数,初始化变量 • END: 读完文件后做最终的处理 • 其它 {}:循环读取文件的每一行 •0 表示一行内容;1,2, … NF 表示第一列,第二列到最后一列。 • NF (number of fields) 文件多少列;NR (number of rows) 文件读了多少行: FNR 当前文件读了多少行,常 用于多文件操作 • a[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

文章来源:生信宝典

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342