linux文件格式处理命令cut,grep,sed,awk:批量修改多文件中序列名
要处理一份10多个G序列数据的序列名,据说直接的linux命令是最快的,回头来复习一下这几个命令吧。什么是选取命令?就是将一段数据经过分析后,取出我们想要的或者经由分析关键词,取出我们想要的那一行。通常选取信息是针对一行一行来分析的,并不是整篇分析。**1 cut**cut命令可以将一段信息的某一段给它切出来,也就是将一行里面的数据进行分解,它是以行为单位处理数据的。常用的有两种:(1)对于有特定
要处理一份10多个G序列数据的序列名,据说直接的linux命令是最快的,回头来复习一下这几个命令吧。
什么是选取命令?
就是将一段数据经过分析后,取出我们想要的或者经由分析关键词,取出我们想要的那一行。通常选取信息是针对一行一行来分析的,并不是整篇分析。
**
1 cut
**
cut
命令可以将一段信息的某一段给它切出来,也就是将一行里面的数据进行分解,它是以行为单位处理数据的。
常用的有两种:
(1)对于有特定分隔字符的的文本,分隔后获取其第m‘区域’与n‘区域’的信息:
cut -d '分隔的字符' -f m,n filename
(2)对于排列整齐的信息,获取其一行中m到n字符处的信息:
cut -c m-n filename
**
grep
**
cut
命令是将一行信息当中取出部分我们想要的,而grep
则是分析一行信息,若当中有我们所需要的信息,就将该行拿出来。
简单的语法是这样的:
grep [-acinv] '查找字符' filename
选项参数为:
-a
将二进制文件以文本文件的方式查找数据
-c
计算找到’查找字符’的次数
-i
忽略大小写
-n
输出行号
-v
反向选择
假设我们要提取出一个fasta序列文件中的标题行:
grep '>' fasta.faa
那再顺道统计一下序列条数吧:
grep '>' fasta.faa | wc
grep还有一些进阶功能:
grep [-A] [-B] '查找字符' filename
选项参数:
-A
after的意思,指除了该行外还再列出该行后多少行
-B
before的意思,指除了该行外还再列出该行前多少行
假设我们要查询文件中一个名为“xueba”的蛋白序列,忽略大小写更靠谱:
grep -A 30 -i 'xueba' filename
grep
是支持正则表达式的,可以方便我们对数据进行搜索,不知道python的正则表达式与linux中是不是一样的,下次好好看看再写写吧。
**
sed
**
sed
可以对数据进行替换、删除、新增选取特定行等功能,相当有用。
基本语法:
sed [-nefri] [m[,n]] [acdips] filename
选项参数:
-n
:安静模式,加上n后只有被处理的行才会输出到屏幕上
-e
:直接在命令行模式上进行sed的操作
-f
:直接将sed的操作写在一个文件内, -f filename 则可以执行filename内的sed操作
-r
: sed操作使用的是扩展型正则表达式语法
-i
:直接修改读取文件的内容,而不是由屏幕输出
[m[,n]]
:待操作行,m到n行,非必须参数
功能参数:
a
:新增,a后面接字符,这些字符会在当前行的下一行出现
c
:替换,c后面接字符,这些字符会替换n1到n2行的内容
d:删除
i
:插入,i后面接字符,这些字符会在当前行的上一行出现
p
:打印,将某个选择的数据打印出来,常与sed -n一起用
s
:替换,可以直接进行替换工作,可以搭配正则表达式,是我们最常用的功能
看例子:
sed行处理
(1)删除第n到最后一行:
sed 'n,$d' filename
(2)在第n行后增加‘xueba’
sed 'na xueba' filename
(3)在第n行后增加’xueba’和’daxueba’两行:
sed 'na xueba \ daxueba' filename
(4)将m到n行替换为’xueba’:
sed 'm,nc xueba' filename
(5)取出第m到n行:
sed -n 'm,np' filename
sed替换功能
常用语法:
sed 's/要被替换的字符/新的字符/g' filename
(1)将’xueba’替换为’daxueba’:
sed 's/xueba/daxueba/g' filename
(2)删除文件中的注释行和空白行:
sed 's/#.*$//g' | sed '/^$/d' filename
(3)直接对文件进行替换更改,加-i参数
sed -i 's/xueba/daxueba/g' filename
**
awk
**
sed常常用于一整个行的处理,awk则倾向于将一行分成数个字段处理,awk更适合处理小型数据。
回头补上这段… …
############################################################
回到正题来,现在我有几十个G序列文件,内容如下所示,我想给每个序列的>后加上文件名,形成>filename_gene_…的格式:
>gene_3|GeneMark.hmm
IGYAQEPIEISAGKRGSETYIYIYIYIYIYIYIHRWAEPAKIDMKAHTGVGGVSA
>gene_4|GeneMark.hmm
WRDFILPRLDLEKMIDEQTGLPFSREKLELAFTDSHERIRTDGMVDLDPGKASGSKALAN
RNQDHRFFVFKDADSWMEYMARDIAMMEVLGPNPDLTIRFL
使用循环来对所有文件执行替换:
for file in `ls $1`
do
eval sed -i 's/gene_/${file%.*}_gene_/' $file
done
修改后的结果:
>aaa_gene_3|GeneMark.hmm
IGYAQEPIEISAGKRGSETYIYIYIYIYIYIYIHRWAEPAKIDMKAHTGVGGVSA
>aaa_gene_4|GeneMark.hmm
WRDFILPRLDLEKMIDEQTGLPFSREKLELAFTDSHERIRTDGMVDLDPGKASGSKALAN
RNQDHRFFVFKDADSWMEYMARDIAMMEVLGPNPDLTIRFL
注意!
(1)使用[for file in `ls $1`]
对当前目录下所有文件执行遍历,[`ls $1`]
两旁使用的不是单引号,是英文输入法状态下键盘tab键上面的那个 ` 字符。
(2)eval
会扫描两次要执行的操作,先识别其中的变量${file}
内容后再执行操作。也可以不使用eval,而使用"s/gene_/${file%.*}gene/",双引号将语句括起来。
(3)若是产生"sed:-e 表达式 #1,字符 11:“s”的未知选项"
的报错的话,说明我们的变量名中含有与sed操作’s/gene_/${file}gene/'相同的符号,这时候可以使用#
替换/
,或者使用!
也可以!
(4)如果文件名是aaa.txt,最后怎么去掉.txt呢?使用${file%.*}
,它表示删除右边算起第一个.
右边的内容.txt,只保留左边aaa。
这里使用${}
来对变量的进行提取和替换等操作,它可以以任意字符作为处理的'flag'
,和#与%
一起使用,来达到我们想要的结果:
其中:
#
:表示从左边算起第一个
%
:表示从右边算起第一个
##
:表示从左边算起最后一个
%%
:表示从右边算起最后一个
即:#总是表示左边算(删除左边的
),%总是表示右边算(删除右边的
)。
*:表示要删除的内容
.
表示用来分隔的字符,可以是任意字符:字母,数字,符号都可以
${var##a*}
表示删除变量var从左边算起最后一个字符a及其左边的字符。
更多推荐
所有评论(0)