Day32-awk分隔符中的“异类”们

2019-08-21  本文已影响0人  腐草为嘤

    我发现只要一开始做课题,永远不会少的东西就是问题。
    昨天刚刚总结了关于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深深折服的一天,给跪啦!

上一篇 下一篇

猜你喜欢

热点阅读