美文网首页
Day32-awk分隔符中的“异类”们

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

作者: 腐草为嘤 | 来源:发表于2019-08-21 22:05 被阅读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深深折服的一天,给跪啦!

    相关文章

      网友评论

          本文标题:Day32-awk分隔符中的“异类”们

          本文链接:https://www.haomeiwen.com/subject/laewsctx.html