我发现只要一开始做课题,永远不会少的东西就是问题。
昨天刚刚总结了关于awk如何统计某列最大最小值的问题,今天又遇到一个很有意思的awk特例,问题来源于同组同学。
她询问我,有以下的蛋白质FASTA文件,她想要提取出标题行的第8列信息重新命名标题行应该怎么做?
需求如下:
#Raw Data
>Sample||0001||1284267||1285379||mRNA||1||CDS||936861456||1||frame0
Protein Sequence
...
#Results
>936861456
Protein Sequence
...
我一看,这个还挺简单的,直接awk走起不就完事了吗?
awk -F"||" '{if($0~/^>/)print ">"$8;else print $0}' fastafile > test.txt
结果出来我傻了,标题行的编号去哪儿了?怎么只剩下一个孤零零的大于号,仿佛在嘲笑我的悲伤无限大……
最好的老师永远是度娘,搜索之后我得知,||
这样的字符在awk中属于特殊的分隔符,不能够直接匹配,需要先用单括号括起来,再加上双反斜线\\
进行转义才能够匹配,于是命令就变成了:
awk -F'\\|\\|' '{if($0~/^>/)print ">"$8;else print $0}' fastafile > test.txt
这样总算能够正常输出结果啦,其实在awk中这样的特殊分隔符还有很多,例如\
、<
、>
、(
、)
、\n
、\t
、&
、;
、'
、"
、管道符、空格或反引号等在shell中有特殊意义的字符作为分隔符,那么都要使用双引号或者单引号把它们先包裹起来;还有就是像我今天遇到的这样多个特殊字符作为分隔符,例如$
、^
、*
、(
、)
、[
、]
、?
、.
、|
,都要会用双反斜线\\
进行转义,当然用两个以上的反斜线也是可以的,不过外面一定记得使用单括号。
今天又是为awk深深折服的一天,给跪啦!
网友评论