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


    编译环境

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

    【脚本编译环境】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

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

  • 相关阅读:
    [Multimedia] 下载 m3u8 格式视频
    [Multimedia] 合并两个 MP4 文件
    [Multimedia] FLV 相关分析工具
    [Android] 从 logcat 日志中获取设备的 mac 地址信息
    [Android Tips] 33. Lottie 在 RecyclerView onBindViewHolder 中 playAnimation 不生效
    [Multimedia] 旋转 MP4 视频方向
    [Jenkins] Jenkins changes 显示 git log 乱码解决
    [Jenkins] Jenkins 时区设置
    [Gradle] 解决高德 jar 包打包到 aar 后 jar 包中的 assets 内容丢失
    [Gradle] 发布 library 到本地 maven 仓库
  • 原文地址:https://www.cnblogs.com/gina/p/3247220.html
Copyright © 2020-2023  润新知