惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
博客园 - 【当耐特】
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
Last Week in AI
Last Week in AI
IT之家
IT之家
V
V2EX
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
博客园 - 叶小钗
Martin Fowler
Martin Fowler
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
博客园 - 聂微东
MyScale Blog
MyScale Blog
云风的 BLOG
云风的 BLOG
The Cloudflare Blog
WordPress大学
WordPress大学
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
酷 壳 – CoolShell
酷 壳 – CoolShell
博客园 - 三生石上(FineUI控件)
Cyberwarzone
Cyberwarzone
Scott Helme
Scott Helme
H
Help Net Security
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The GitHub Blog
The GitHub Blog
Cisco Talos Blog
Cisco Talos Blog
D
DataBreaches.Net
P
Palo Alto Networks Blog
T
Threatpost
P
Privacy & Cybersecurity Law Blog
L
LINUX DO - 最新话题
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
B
Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
P
Proofpoint News Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Cloudbric
Cloudbric
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
N
News and Events Feed by Topic
T
The Blog of Author Tim Ferriss
L
Lohrmann on Cybersecurity
量子位
Security Latest
Security Latest
Google DeepMind News
Google DeepMind News
Y
Y Combinator Blog
aimingoo的专栏
aimingoo的专栏
Forbes - Security
Forbes - Security
T
Tailwind CSS Blog

博客园 - 进击的程序员

cuowu Angular4+路由 由href return false 来看阻止默认事件 TypeScript的配置文件 tsconfig.json Java标记接口 动手编写TCP服务器系列之一:日志文件 Shell语言系列之一:文件处理 给Amazon ec2 增加卷(Volume)并挂载到系统 Java打包问题之一:打包出现java.io.IOException: invalid header field struct中长度为0的数组用途与原理 面试题之堆栈队列系列一:设计包含min函数的栈 awk处理之案例六:awk根据条件插入文本 程序员的数学之余数:星期数的思考 面试题之实现系统函数系列一:实现memmove函数 awk处理之案例五:awk匹配字段2包含字段1的文本 awk处理之案例四:sort加awk来过滤文本 字符串面试题系列之七:字符串全排列 awk处理之案例三:awk去掉不需要的文本行 awk处理之案例一:awk 处理百分比的问题
awk处理之案例二:awk匹配文本
进击的程序员 · 2013-08-09 · via 博客园 - 进击的程序员

编译环境

   本系列文章所提供的算法均在以下环境下编译通过。

【脚本编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
【内存】 2025272 kB

前言

    awk是脚本中出色的文本处理工具。源码好像也是用C语言写的。本系列会针对不同的案例,用awk来解决我们所要的问题。 为什么会用awk呢?我们当然可以使用C语言或者java语言来对文本做处理,但每次都要编译会令人发疯的。修改起来也麻烦,正所谓杀鸡焉用牛刀。而脚本的灵活便捷使得工作变得更加轻松容易。在shell脚本编程中,awk堪称瑞士军刀绝不为过。

    本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

正文

【场景】

   现在有两个文本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当中则输出另外一种格式。

【测试】

10

作者

   出处:http://www.cnblogs.com/gina

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