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

摘要

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 N
ABCC9 NM_020297.2 Y
ACE NM_000789.3 Y
ADD1 NM_001119.4 N
ADD1 NM_014189.3 Y
b.txt 文本内容如下:

ABCC9 NM_020297
ACE        NM_000789
ACER1        NM_133492
ACE2        NM_021804
ADD1 NM_001119.4 
ADD1 NM_014189.3 
ADD1 NM_014190.3 
ADD2 NM_001185055.1 
提取完之后,c.txt 文本内容如下:

ABCC9 NM_020297 1
ACE        NM_000789 1
ACER1        NM_133492 1
ACE2        NM_021804 1
ADD1 NM_001119.4 N 0
ADD1 NM_014189.3 Y 0
ADD1 NM_014190.3  1
ADD2 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 file2
1 a b c d
2 a b d c
3 a c b d
4 aa bb cc dd
5 aa bb dd cc
6 aa cc bb dd

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

1 a b c d
2 a b d c
3 a c b d
1 aa bb cc dd
2 aa bb dd cc
3 aa cc bb dd

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


脚本输出


作者:Alex

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值