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

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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,435评论 0 5
  • 基础命令 主要的命令和快捷键 Linux系统命令由三部分组成:cmd + [options]+[operation...
    485b1aca799e阅读 1,119评论 0 0
  • 转载 原文的排版和内容都更加友好,并且详细,我只是在这里贴出了一部分留作自己以后参考和学习,如希望更详细了解AWK...
    XKirk阅读 3,246评论 2 25
  • netstat -tnlp|egrep -i "$1"|awk {'print $7'}|awk -F'/' '{...
    JerichoYu阅读 1,022评论 0 0
  • Linux指令中文说明传送入口 整理自Linux指令中文说明 文本和数据进行处理的编程语言awk 是一种编程语言,...
    释闲人阅读 2,145评论 1 6