awk处理之案例二:awk匹配文本

来源:互联网 发布:中信证券怎么样 知乎 编辑:程序博客网 时间:2024/05/16 07:36

摘要

awk是一款优秀的处理列文本的小工具。本场景利用awk来匹配文本。把存在a文本中而也在b文本中的文本提取出来存放到c文本中。

前言:

****************************************************

awk是脚本中出色的文本处理工具。源码好像也是用C语言写的。本系列

会针对不同的案例,用awk来解决我们所要的问题。

为什么会用awk呢?是的,我们当然可以使用C语言或者java语言来对文本

做处理,但是小伙伴们不会觉得麻烦么?每次都要编译。修改起来也麻烦,正所谓

杀鸡焉用牛刀。但脚本的灵活便捷使得工作变得更加轻松容易。

***************************************** ***********

【场景】

现在有两个文本a.txt, b.txt,里面包含的内容如下所示。 现在要提取出b中匹配到a的信息,就是第一列基因名相同,第二列NM号也相同的信息,输出a文件的该行到C文件并加上一列“0”,如果b的文件存在a没有的NM号,则把该NM号加进去,并标识为1


a.txt文本内容如下:

ABCC9 NM_005691.2 NABCC9 NM_020297.2 YACE NM_000789.3 YADD1 NM_001119.4 NADD1 NM_014189.3 Y
b.txt文本内容如下:

ABCC9 NM_020297ACE        NM_000789ACER1        NM_133492ACE2        NM_021804ADD1 NM_001119.4 ADD1 NM_014189.3 ADD1 NM_014190.3 ADD2 NM_001185055.1 
提取完之后,c.txt文本内容如下:

ABCC9 NM_020297 1ACE        NM_000789 1ACER1        NM_133492 1ACE2        NM_021804 1ADD1 NM_001119.4 N 0ADD1 NM_014189.3 Y 0ADD1 NM_014190.3  1ADD2 NM_001185055.1  1


代码如下:
# extract txt line from a.txt that also in b.txt# grammer: awk -test.awk a.txt b.txt{   if(NR==FNR)   {      a[$1$2]=$0      next   }   if($1$2 in a)   {      print a[$1$2]" 0"   }   else   {      print $0" 1"   }}

解释一下:NR是工作中的记录数;FNR是当前输入文件的记录上。

当输入一个文件时,NR和FNR输出是一样的;当输入2个以上文件时,NR和FNR输出是不一样的。例如:

# awk '{print NR,$0}' file1 file21 a b c d2 a b d c3 a c b d4 aa bb cc dd5 aa bb dd cc6 aa cc bb dd

# awk '{print FNR,$0}' file1 file2

1 a b c d2 a b d c3 a c b d1 aa bb cc dd2 aa bb dd cc3 aa cc bb dd

上面语句的意思是,当NR和FNR相等的时,即第一个文件的内容全部存储到a当中。底下两个判断,如果是遍历a,b文件中所有行,如果在a当中则输出一种格式,如果不在a当中则输出另外一种格式。


脚本输出


作者:Alex

出处:http://blog.csdn.net/hellotime
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。