前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >生信马拉松 Day13 Linux-3笔记

生信马拉松 Day13 Linux-3笔记

原创
作者头像
阿呆的月历
发布2024-02-04 16:10:44
1240
发布2024-02-04 16:10:44
举报
文章被收录于专栏:生信马拉松生信马拉松

文本处理三架马车

grep sed awk

1、grep

一种强大的文本搜索工具,能使用正则表达式匹配搜索文本,并把匹配的行打印出来

grep options pattern file

实际容忍度很高,pattern写在左后,或者options写在pattern后面都可以

无法查找压缩文件,只能看普通的文本文件,所以可以先用less打开文件然后再grep

-r 从目录中,看看内部的所有文本文件有没有这个关键词

-n 显示文件中的行号

代码语言:sh
复制
grep 'TATAGG' -r Data/ -n

-w word,精确地查找某个关键词,但是除了 -_ 之外的符号可能没有办法过滤,而把类似=gene;中的gene也纳入

所以grep搜完之后记得肉眼检查一下

-c 统计成功的行

-v 输出没有成功的行

-v -c 统计没有匹配项的行数

-e 多个匹配模式,有几个关键词就写几个-e

代码语言:sh
复制
cat Data/example.gtf | grep -w -e 'exon' -e 'CDS'

注意预防性地加-w,保证匹配的是“CDS”而不是形如“CCDS”的字符

-f 从指定文件中读取要匹配的模式

常见用法:vim file 使用insert每行输入一个需要匹配的pattern,然后grep -f

代码语言:sh
复制
cat Data/example.gtf | grep -f file -w

正则表达式

^ 行首,以什么玩意开始的行

代码语言:sh
复制
cat Data/example.fa | grep '^ATCG' -n

$ 行尾,以什么pattern结尾的行

代码语言:sh
复制
cat Data/example.fa | grep 'ATCG$' -n

. 换行符之外的任意单个字符

代码语言:sh
复制
cat Data/example.fa | grep 'ATCGG.$' -n 
代码语言:sh
复制
cat Data/example.fa | grep 'ATCGG..$' -n

? 匹配之前项0次或1次的情况

代码语言:sh
复制
cat Data/example.fa | grep 'A\?TCGG..$' -n  

或者-E开启扩展正则,此时不用写\符号,会自动把?识别为正则表达式里的?,此时再用\?就不出结果了

+ 匹配1次多多次的情况,也是扩展正则

代码语言:sh
复制
cat Data/example.fa | grep 'A\+TCGG..$' -n

* 匹配0次或多次,是普通正则

所以用grep时可以都带上-E 这样避免忘记是普通正则还是扩展正则

[] 匹配任意一个字符

代码语言:sh
复制
cat Data/example.fa | grep 'A\+TCGG[TG]$' -n

排除字符 (这个地方腾讯云显示不出来,参考下面的代码吧)

代码语言:sh
复制
cat Data/example.fa | grep 'A\+TCGG[^TG]$' -n

| 或者 注意加空格含义就会改变,和用-e一个个输入的方法一致

代码语言:sh
复制
cat Data/example.fa | grep -E 'ATCATCT|TATAGGG' -n

-i 忽略大小写的问题

2、sed

流编辑器,一般用来对文本进行增、删、改、查四个动作

sed options 'script' file(s)

除非用-i,否则不修改文件内容,只是修改打印在屏幕过程中的内容

-n 只打印处理过的行,所以参数里必须有p,只是检索的话不如grep,优势是可以和sed的替换共同使用

-e 多个命令,先做一个再做一个

-r 正则表达式

script" 由 'script' address command 构成

address的内容

2 :第2行

2,4 :第2~4行

2,$ :第2行到最后一行,$表示最后

2~3:从第2行开始,每隔3行取1行,2/5/8

2,+4:从第2行到2+4行

/pattern/

匹配上pattern的行

其中使用!符合表示取反

command

a:append,在指定行的后面增加一行,内容为a后面的字符串

代码语言:sh
复制
cat readme.txt | sed '1 a Hi!'

i:insert,在指定行的前面增加一行,内容为i后门的字符串

代码语言:sh
复制
cat readme.txt | sed '1 i Hi!'

d:delete,删除某一行或某几行,也可以指定删除匹配上的行

代码语言:sh
复制
cat readme.txt | sed '1d'

c:change,改变指定行的内容,整行替换

s:更改或替换字符串,改变行中的部分内容,'s/pattern/new/flags',把pattern替换成new,类似vim的末行模式,默认只替换一个,可以指定flags,可以写数字表示第几个,写g代表全局

代码语言:sh
复制
cat readme.txt | sed '1~3s/ee/EE/g'    
#对第1和第3行进行替换,第4行不变

y:转化,实现字符一对一转化,要求前后数量一致,'y/abc/ABC'

p:print,把匹配或修改的行打印出来,常常和-n连用

注意:所有的sed行号都是指原本的行,不包括更改后增加的行

代码语言:sh
复制
cat readme.txt | sed  -e '2 d' -e '2 i Hi?' 

此时并不会增加"Hi!"的一行,先删除再增加可能引起会失效,因此使用sed注意顺序

代码语言:sh
复制
cat readme.txt | sed -e '2,4 a \*\*\*' -e '2,4d'

cat readme.txt | sed '2,4 c \*\*\*\n\*\*\*\n\*\*\*'
#这两个代码功能相同

sed全部转化为大写的方式

代码语言:sh
复制
cat readme.txt | sed 's/[a-z]/\U&/g'

3、awk

也称gawk,编程语言,可对文本和数据进行处理

常见参数:-F,fields,或者可以理解为一列,设置按什么字段分隔符来取列,所有空白字符都会被当做分隔符

用法:awk options '{script}' file

基础结构:'{script}'

匹配结构:'/pattern/{script}'

扩展结构:'BEGIN{script}{script}END{script}'

$0 代表整行

$1 第一列 ,写“,”默认是用空格键分隔输出的列

代码语言:sh
复制
cat Data/example.gtf | awk '{print $9,$10}' | head    

$NF 最后一列

代码语言:sh
复制
cat Data/example.gtf | awk '{print $9"\n"$10}' | head   
#用换行来作为9和10列的分隔,注意是双引号

与cut的用法不同,awk可以按照你要求的顺序显示,也可以重复打印同一列

代码语言:sh
复制
cat Data/example.gtf | awk '/UTR/{print $1,$4,$7,$4}' | head

awk扩展结构的其他内容

FS fieldseparator,定义输入字段分隔符,同-F

RS record separator,定义输入记录分隔符,相当于一行的分隔,例如我们默认回车为一行,用RS修改为空格,那么就会把空格前的最为一行

OFS 定义输出字段分隔符

ORS 定义输出记录分隔符

NR 打印行号

NF 列数

代码语言:sh
复制
cat Data/example.gtf | awk 'BEGIN{OFS=";"}{print $3,$4,$5}' |head  
#注意也是双引号
代码语言:sh
复制
cat Data/example.gtf | awk 'BEGIN{OFS=";"}{print NR $3,$4,$5}' |head 

注意:awk设置了OFS等内容时,所有的列之间分隔都是统一的,无法对每一个分隔符单独设置

awk 条件和循环

awk '{if(判断语句){yes} else{no}}'

没有else的时候可以不写yes的{}

代码语言:sh
复制
zcat Data/Homo\_sapiens.GRCh38.102.chromosome.Y.gff3.gz | awk '{if($3=="gene")print $0}' |wc -l   
#47
#注意是==且有""号

awk的循环用的相对比较少

awk'{for (循环条件){循环语句}}'

代码语言:sh
复制
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的自然对数

代码语言:sh
复制
less -S Data/example.gtf | awk '/exon/{print$5-$4}' |head

Linux常见符号及含义

来自:生信技能树,生信马拉松,卖萌哥
来自:生信技能树,生信马拉松,卖萌哥

TIPS

1、fastq文件里,序列行用@开头,但是可能有碱基质量刚好是@开头,只用grep的^@检索可能会混入第四行的内容,检索时注意检查

2、会修改原文件的几种情况

(1)cat > <file> 文件就被清空了,所以修改原文件又想保存回来需要新命名一个文件再mv

(2)vim

(3)sed -i

(4)把输入文件作为输出文件,就会被清空

3、sed里出现>类似R里控制台的+,提示还没写完,需要补齐

生信技能树,生信马拉松,卖萌哥

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文本处理三架马车
    • 1、grep
      • 2、sed
        • address的内容
          • /pattern/
            • command
              • 3、awk
              • Linux常见符号及含义
              • TIPS
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档