生信实战分析中常用的Linux命令(三)

这一部分我将讲解awk、grep、sed三个文本操作的强大利器,三个命令基本都是以正则表达式为基础。在数据分析过程中,我们通常需要提取出符合条件的文本、修改文本以进行后续分析。

我首先简单介绍一下正则表达式,正则表达式是一种用于匹配和操作文本的强大工具,它是由一系列普通字符和特殊字符组成的模式,用于描述要匹配的文本模式。正则表达式可以在文本中查找、替换、提取和验证输入。正则表达式由普通字符(例如字母、数字、空格等)和元字符(特殊字符)组成。
字母、数字、汉字、下划线、以及没有特殊定义的标点符号,都是普通字符。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的字符。
特殊字符,就是一些有特殊含义的字符,比如^表示匹配输入字符串的开头,$表示匹配输入字符串的结尾等。


基础正则表达式常用的特殊字符
扩展正则表达式常用的特殊字符

接下来我们分别介绍三个命令
grep命令更适合单纯的查找或匹配文本。它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,搜索的结果被送到标准输出(终端),不影响原文件内容。

#pattern 参数表示在文件中搜索的文本模式或正则表达式模式
grep [options] pattern file
#搜索文本中echo字符
grep echo RNA-seq.sh
#搜索位于行首的echo字符串
grep ^echo RNA-seq.sh
#一些常用的参数包括 -c:统计匹配上的行数,从而统计某个模式在文件中出现的次数。-i:忽略字符大小写的差别;-n:在输出中显示匹配到的行的行号,有助于定位。-o:仅显示匹配到的字符串,不显示整行。-v:显示不被 pattern 匹配到的行,相当于[^]。-E 支持使用扩展正则表达式
grep -c ^echo RNA-seq.sh #返回3

sed是一个“非交互式的”面向字符流的编辑器。能同时处理多个文件多行的内容,可以不对原文件改动,把整个文件输入到屏幕,可以把只匹配到模式的内容输入到屏幕上。还可以对原文件改动,但是不会再屏幕上返回结果。sed更适合编辑匹配到的文本

sed [option] 'sed command' file
#sed conmmand 包括:
#替换命令 s:语法:s/old_pattern/new_pattern/g,输出修改后的整个文件到屏幕上,但是没有改变原文件。
sed "s/config/fastq/g" RNA-seq.sh
#删除命令 d:删除匹配到的行。sed '/pattern/d' file.txt。这里是删除空白行
sed "/^$/d" RNA-seq.sh
#打印命令 p:打印匹配到的行。sed -n '/pattern/p' file.txt,其中-n是选项参数,代表只输出匹配到的行
sed -n "/config/p" RNA-seq.sh
#行追加命令 a:语法:a\text_to_append,在匹配到的行之后都追加新文本。sed '/pattern/a\new_line_to_append' file.txt
sed "/trim-galore/a\less nohup.out" RNA-seq
#行插入命令 i:i\text_to_insert,在匹配到的行之前插入新文本。sed '/pattern/i\new_line_to_insert' file.txt。
#行替换命令 c:c\new_text,用新文本替换匹配到的行。sed '/pattern/c\new_line_to_replace' file.txt
#行号命令 =:打印每一行的行号。sed '=' file.txt
sed "=" RNA-seq.sh
#字符集合命令 []:匹配字符集合中的任意一个字符。sed 's/[aeiou]/_/g' file.txt
sed "s/[R1]/read1/g RNA-seq.sh
#范围选择命令 :选择输出匹配到的起始和结束模式之间的内容。sed -n '/start_pattern/,/end_pattern/p' file.txt

option参数包括-n :只输出模式匹配的行
-i :直接在原始文件中进行编辑,并将修改后的内容写入到原文件中,而不是输出到标准输出。默认情况下,sed 命令会将处理后的结果输出到标准输出,而不会修改原始文件。
-e :在同一行上指定多个 sed 命令,sed 将按照指定的顺序依次执行这些命令。此为默认选项。sed -e "s/config/fastq/g" -e "/trim-galore/a\less nohup.out" RNA-seq.sh
-f :指定一个脚本文件,其中包含了一系列的 sed 命令。sed 将会按照脚本文件中命令的顺序依次执行这些命令。sed -f script.sed RNA-seq.sh
-r :支持扩展正则表达式

awk命令是功能最强大的。awk 更适合格式化文本和处理复杂文本操作,awk 可以根据指定的分隔符对文本进行拆分,提取、重新组合和输出字段,支持多种内置变量和操作符,使得文本格式的修改和数据的提取非常灵活。awk 可以执行条件判断、模式匹配、循环和函数调用等复杂操作,适合处理大规模和结构复杂的文本数据。
语法结构:awk option 'pattern{action}' {filenames}
注意要用单引号 ' '
pattern:是用于匹配输入数据的模式,action是在匹配到模式的行上执行的操作
常用options 参数
-F: 指定输入字段的分隔符,默认是空格。
-v <变量名>=<值>: 设置 awk 内部的变量值。内置和自定义变量前都加 -v 选项
-f <脚本文件>: 指定一个包含 awk 脚本的文件。可以在文件中编写较大的 awk 脚本,然后通过 -f 选项将其加载

#使用一个脚本来汇总stringtie表达量结果,接下来以这个为例进行文本操作
vi sample_list.txt
C1  /home/RNA-seq/stringtie/C1_count.gtf
C2  /home/RNA-seq/stringtie/C2_count.gtf
C3  /home/RNA-seq/stringtie/C3_count.gtf
E1  /home/RNA-seq/stringtie/E1_count.gtf
E2  /home/RNA-seq/stringtie/E2_count.gtf
E3  /home/RNA-seq/stringtie/E3_count.gtf

常用的awk内置变量,包括

#FS:输入字段分隔符。同-F参数,
awk -F "\t" ‘{print$1}’ sample_list.txt
awk -v FS="\t" ‘{print$1}’ sample_list.txt
#OFS:输出字段分隔符。例如将txt文件每行的第1和2字段提取出来,并将分隔符设置为制表符(Tab)输出
awk -v OFS="\t" '{print $2, $1}' sample_list.txt,
#RS:输入记录分隔符。用于定义 awk 读取输入时的记录分隔符。默认值为换行符 \n,即每行被视为一个记录。
#ORS:输出记录分隔符。
#NF:代表输出记录中的字段数。$NF 表示最后一个字段。$(NF-1)是倒数第2列
awk '{print "Number of fields:", NF, "Last field:", $NF}' sample_list.txt
#输出Number of fields: 2 Last field: /home/RNA-seq/stringtie/C1_count.gtf
#Number of fields: 2 Last field: /home/RNA-seq/stringtie/C2_count.gtf
#...
#NR:代表输出记录(行)号。每个输出记录一个行号。后可跟多个文件,第二个文件行号继续从第一个文件最后行号开始。
#$0:表示整行内容。$1, $2, ...:表示第1、2个字段。
$awk '{print NR, $0}' sample_list.txt

awk 支持一系列操作符,用于执行数学运算、字符串操作和逻辑比较
算术操作符:+、- 、、/:除法、%:取余、^:幂运算。
赋值操作符:=:赋值、+=:加等于、-=:减等于、
=:乘等于、/=:除等于、%=:取余等于。例如num=10 num+=5就是先10+5,再将15赋值给num
比较操作符:==:等于、!=:不等于、<:小于、>:大于、<=:小于等于、>=:大于等于。
逻辑操作符:&&:逻辑与、||:逻辑或、!:逻辑非。
字符串操作符 :"~" 匹配正则表达式、"!~" :不匹配正则表达式。例如awk '$0 ~ /C1/' sample_list.txt 输出所有包含C1的行

我以cut-tag数据分析中的文件为例,因为转录组数据比较简单,无需复杂的awk命令

#首先以bedpe文件为例,用于表示双末端bed文件,每一列分别为chrom1   start1   end1   chrom2   start2   end2   name   score   strand1   strand2
#将文件中第一列等于第四列(在同一染色体上)且终止-起始<1000的行打印出来
awk '$1==$4 && $6-$2 < 1000 {print $0}' C1_bowtie2.bed 
#输出第6列减去第2列的绝对值,即片段长度
#定义一个函数 abs 用于计算绝对值,renturn:函数的返回值,(condition) ? (if_true) : (if_false),如果x<0.0,返回-x,否则返回x。
awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($9-$2)}' C1_bowtie2.bed

其他常用于文本操作的命令还有一些cut命令、sort命令、uniq命令
cut 命令用于从文件或标准输入中提取指定字段或字符位置的数据,可以根据字段的分隔符将每行数据分割成多个字段,并选择需要提取的字段进行输出
cut [选项] [文件]
常用选项:

#-b 或 --bytes:按字节选择,适合处理二进制文件。提取每行的第1到5个字节
cut -b 1-5 file
#-c 或 --characters:按字符选择,适合处理文本文件。提取每行的第1到5个字符
cut -c 1-5 file
#-f 或 --fields:按字段选择,字段是以指定分隔符分隔的部分。-d 或 --delimiter:指定字段分隔符,默认为制表符。如以逗号为分隔符,提取每行的第2个字段
cut -f 2 -d "," file
#-s, --only-delimited:不打印不包含分隔符的行。例如,使用逗号分隔并忽略不含逗号的行
cut -d "," -f 2 -s file
#--complement:显示除了指定部分以外的所有部分。例如,显示除第1到3个字符以外的所有字符
cut -c 1-3 --complement file
#--output-delimiter="," 用于指定输出字段的分隔符

sort 命令用于将文本文件内容加以排序。以行为单位来排序。
sort [-bcdfimMnr][-o<输出文件>][-t<排序时用的分隔符>][-k field1,field2][文件]

#-b 忽略每行前面开始出的空格字符
#-c 检查文件是否已经按照顺序排序,如果没有排序则输出错误信息。
#-d 排序时,处理英文字母、数字及空格字符外,忽略其他的字符。以字典顺序排序
#-f 忽略大小写进行排序。
#-m 将几个排序好的文件进行合并。
sort -m file1.txt file2.txt
#-n 依照数值的大小排序
#-r 以相反的顺序来排序
#-k field1,field2指定按字段排序,可以指定开始和结束字段。识别字段分隔符(默认空格)。
#-k用于指定排序的键,而后面跟随的 n 表示按照数字进行排序。1,1 表示只对第一个字段进行排序,即只考虑第一个字段的值,不考虑后续的字段。k2,2n:表示在第一个字段相同的情况下,只按照第二个字段进行排序,即按照数字的大小排序,而不是按照字典序排序。
sort -k 1,1 -k 2,2n file
#排序依据为第二字段的全部内容
sort -k 2 file

uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用,因为uniq 需要排序的输入才能正确地识别重复的行。
uniq [选项] [输入文件][输出文件]
常用的选项包括

#-c 显示每行重复出现的次数
sort file | uniq -c
#-d:仅显示重复的行
sort file | uniq -d
#-u:仅显示唯一的行,即没有重复的行
#-i:忽略大小写
#-f N:忽略每行的前N个字段
sort file | uniq -f 2
#-s N:忽略每行的前N个字符
#-w N:比较每行的前N个字符。例如,比较每行的前5个字符,以识别重复行,输出每行前5个字符唯一的行
sort file | uniq -w 5

还是以cut&tag数据分析为例

#代码主要用于计算从一组 SAM 文件中提取的双端比对的片段长度分布,并将结果保存到相应的文件中
#samtools view 命令用于查看 SAM/BAM 文件内容。-F 0x04用于过滤掉那些未比对上的序列

for name in $root/2.map/bowtie2_result/*_bowtie2.sam
do
    samtools view -F 0x04 $name | \
    #awk -F'\t' 指定输入文件以TAB为字段分隔符。定义一个 abs 函数,用于计算绝对值。打印第九列(即片段长度)的绝对值
    awk -F'\t' 'function abs(x){return ((x < 0.0) ? -x : x)} {print abs($9)}' | \
    #sort 对片段长度进行排序。uniq -c 统计每个不同片段长度出现的次数。
    #-v OFS="\t" 设置输出字段分隔符为制表符。输出第二列(片段长度)和第一列(计数)的一半。这里的 $1/2 是因为 uniq -c 输出的计数实际上是两次比对的计数结果,需要除以 2 得到实际的配对数量。
    sort | uniq -c | awk -v OFS="\t" '{print $2, $1/2}' \
    #将处理结果重定向到 $path/2.map/fragmentLen/ 目录中的新文件中。
    > $path/2.map/fragmentLen/$(basename $name "_bowtie2.sam")_fragmentLen.txt 
done
#在 BEDPE文件中,每一行代表一个基因组区域或一个比对结果,第 1 列(chrom1):第一个读取的染色体名称。第 2 列(start1):第一个读取的起始位置。第 3 列(end1):第一个读取的结束位置。第 4 列(chrom2):第二个读取的染色体名称。第 5 列(start2):第二个读取的起始位置。第 6 列(end2):第二个读取的结束位置。
#首使用 cut 命令提取C1_bowtie2.clean.bed指定列(第 1、2 和 6 列)。然后按第 1 列(染色体)、第 2 列(比对基因的起始位置)和第 3 列(比对基因结束位置)排序。再将最终结果保存到指定文件。
#这段代码的作用就是提取关键信息,即比对上的基因位置,并按基因在染色体上的位置进行排序
cut -f 1,2,6 C1_bowtie2.clean.bed | sort -k1,1 -k2,2n -k3,3n > C1_bowtie2.fragment.bed

这一部分比较复杂,一些比较简单的转录组分析很少使用,大家可以结合自己的数据进行学习。目前这是常用Linux命令的最后一部分了,欢迎大家讨论交流,我也会在分析过程中继续总结,查漏补缺。

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

推荐阅读更多精彩内容