grep sed awk
一种强大的文本搜索工具,能使用正则表达式匹配搜索文本,并把匹配的行打印出来
grep options pattern file
实际容忍度很高,pattern写在左后,或者options写在pattern后面都可以
无法查找压缩文件,只能看普通的文本文件,所以可以先用less打开文件然后再grep
-r 从目录中,看看内部的所有文本文件有没有这个关键词
-n 显示文件中的行号
grep 'TATAGG' -r Data/ -n
-w word,精确地查找某个关键词,但是除了 - 和 _ 之外的符号可能没有办法过滤,而把类似=gene;中的gene也纳入
所以grep搜完之后记得肉眼检查一下
-c 统计成功的行
-v 输出没有成功的行
-v -c 统计没有匹配项的行数
-e 多个匹配模式,有几个关键词就写几个-e
cat Data/example.gtf | grep -w -e 'exon' -e 'CDS'
注意预防性地加-w,保证匹配的是“CDS”而不是形如“CCDS”的字符
-f 从指定文件中读取要匹配的模式
常见用法:vim file 使用insert每行输入一个需要匹配的pattern,然后grep -f
cat Data/example.gtf | grep -f file -w
正则表达式
^ 行首,以什么玩意开始的行
cat Data/example.fa | grep '^ATCG' -n
$ 行尾,以什么pattern结尾的行
cat Data/example.fa | grep 'ATCG$' -n
. 换行符之外的任意单个字符
cat Data/example.fa | grep 'ATCGG.$' -n
cat Data/example.fa | grep 'ATCGG..$' -n
? 匹配之前项0次或1次的情况
cat Data/example.fa | grep 'A\?TCGG..$' -n
或者-E开启扩展正则,此时不用写\符号,会自动把?识别为正则表达式里的?,此时再用\?就不出结果了
+ 匹配1次多多次的情况,也是扩展正则
cat Data/example.fa | grep 'A\+TCGG..$' -n
* 匹配0次或多次,是普通正则
所以用grep时可以都带上-E 这样避免忘记是普通正则还是扩展正则
[] 匹配任意一个字符
cat Data/example.fa | grep 'A\+TCGG[TG]$' -n
排除字符 (这个地方腾讯云显示不出来,参考下面的代码吧)
cat Data/example.fa | grep 'A\+TCGG[^TG]$' -n
| 或者 注意加空格含义就会改变,和用-e一个个输入的方法一致
cat Data/example.fa | grep -E 'ATCATCT|TATAGGG' -n
-i 忽略大小写的问题
流编辑器,一般用来对文本进行增、删、改、查四个动作
sed options 'script' file(s)
除非用-i,否则不修改文件内容,只是修改打印在屏幕过程中的内容
-n 只打印处理过的行,所以参数里必须有p,只是检索的话不如grep,优势是可以和sed的替换共同使用
-e 多个命令,先做一个再做一个
-r 正则表达式
script" 由 'script' address command 构成
2 :第2行
2,4 :第2~4行
2,$ :第2行到最后一行,$表示最后
2~3:从第2行开始,每隔3行取1行,2/5/8
2,+4:从第2行到2+4行
匹配上pattern的行
其中使用!符合表示取反
a:append,在指定行的后面增加一行,内容为a后面的字符串
cat readme.txt | sed '1 a Hi!'
i:insert,在指定行的前面增加一行,内容为i后门的字符串
cat readme.txt | sed '1 i Hi!'
d:delete,删除某一行或某几行,也可以指定删除匹配上的行
cat readme.txt | sed '1d'
c:change,改变指定行的内容,整行替换
s:更改或替换字符串,改变行中的部分内容,'s/pattern/new/flags',把pattern替换成new,类似vim的末行模式,默认只替换一个,可以指定flags,可以写数字表示第几个,写g代表全局
cat readme.txt | sed '1~3s/ee/EE/g'
#对第1和第3行进行替换,第4行不变
y:转化,实现字符一对一转化,要求前后数量一致,'y/abc/ABC'
p:print,把匹配或修改的行打印出来,常常和-n连用
注意:所有的sed行号都是指原本的行,不包括更改后增加的行
cat readme.txt | sed -e '2 d' -e '2 i Hi?'
此时并不会增加"Hi!"的一行,先删除再增加可能引起会失效,因此使用sed注意顺序
cat readme.txt | sed -e '2,4 a \*\*\*' -e '2,4d'
cat readme.txt | sed '2,4 c \*\*\*\n\*\*\*\n\*\*\*'
#这两个代码功能相同
sed全部转化为大写的方式
cat readme.txt | sed 's/[a-z]/\U&/g'
也称gawk,编程语言,可对文本和数据进行处理
常见参数:-F,fields,或者可以理解为一列,设置按什么字段分隔符来取列,所有空白字符都会被当做分隔符
用法:awk options '{script}' file
基础结构:'{script}'
匹配结构:'/pattern/{script}'
扩展结构:'BEGIN{script}{script}END{script}'
$0 代表整行
$1 第一列 ,写“,”默认是用空格键分隔输出的列
cat Data/example.gtf | awk '{print $9,$10}' | head
$NF 最后一列
cat Data/example.gtf | awk '{print $9"\n"$10}' | head
#用换行来作为9和10列的分隔,注意是双引号
与cut的用法不同,awk可以按照你要求的顺序显示,也可以重复打印同一列
cat Data/example.gtf | awk '/UTR/{print $1,$4,$7,$4}' | head
awk扩展结构的其他内容
FS fieldseparator,定义输入字段分隔符,同-F
RS record separator,定义输入记录分隔符,相当于一行的分隔,例如我们默认回车为一行,用RS修改为空格,那么就会把空格前的最为一行
OFS 定义输出字段分隔符
ORS 定义输出记录分隔符
NR 打印行号
NF 列数
cat Data/example.gtf | awk 'BEGIN{OFS=";"}{print $3,$4,$5}' |head
#注意也是双引号
cat Data/example.gtf | awk 'BEGIN{OFS=";"}{print NR $3,$4,$5}' |head
注意:awk设置了OFS等内容时,所有的列之间分隔都是统一的,无法对每一个分隔符单独设置
awk 条件和循环
awk '{if(判断语句){yes} else{no}}'
没有else的时候可以不写yes的{}
zcat Data/Homo\_sapiens.GRCh38.102.chromosome.Y.gff3.gz | awk '{if($3=="gene")print $0}' |wc -l
#47
#注意是==且有""号
awk的循环用的相对比较少
awk'{for (循环条件){循环语句}}'
less -S Data/example.gtf | awk '{for(i=1;i<4;i++){print $i}}' | head
# i++表示i=i+1
awk 数学运算
/, ** 平方,% 取余数
int(x) 整数部分,取靠近0一侧的值
log(x) x的自然对数
less -S Data/example.gtf | awk '/exon/{print$5-$4}' |head
1、fastq文件里,序列行用@开头,但是可能有碱基质量刚好是@开头,只用grep的^@检索可能会混入第四行的内容,检索时注意检查
2、会修改原文件的几种情况
(1)cat > <file> 文件就被清空了,所以修改原文件又想保存回来需要新命名一个文件再mv
(2)vim
(3)sed -i
(4)把输入文件作为输出文件,就会被清空
3、sed里出现>类似R里控制台的+,提示还没写完,需要补齐
生信技能树,生信马拉松,卖萌哥
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。