zoukankan      html  css  js  c++  java
  • awk实现join

    awk 有时确实比较省事,做些简单的文本处理,还是很方便的,在这介绍下两个文件的join的操作。

    原始文本

    bb.txt

    a 10
    b 12
    

    cc.txt

    a 11
    b 13
    c 15
    

    awk join主要是用到连个内置的变量 NR,FNR,先看这的区别

    awk '{print NR,FNR,$0}' bb.txt cc.txt
    1 1 a 10
    2 2 b 12
    3 1 a 11
    4 2 b 13
    5 3 c 15
    

    NR是读取所有的行号

    FNR读取每个文件的行号索引号,当文件发生变化时,FNR从1开始计算

    当NR=FNR时读的是第一个文本,当NR=FNR时读的是第二个文本,那么跟awk读取文件关键的思路就是先读第一个文件,然后匹配第二个文件中是否存在。

    awk 'NR==FNR{s[$1]=$2}NR!=FNR{print $0,s[$1]}' bb.txt cc.txt 
    a 11 10
    b 13 12
    c 15 
    

    这个其实是ccl eft outer join bb,稍微解读一下。

    当NR==FNR,其实就是s[a]=10 s[b]=12

    当NR!=FNR时,就是$1 也就是a,b为索引,去cc.txt中查找

    做全关联时,也就是join时可以用下列方法

    awk 'NR==FNR{s[$1]=$2}NR!=FNR && s[$1]{print $0,s[$1]}' bb.txt cc.txt 
    a 11 10
    b 13 12
    awk 'NR==FNR{s[$1]=$2}NR!=FNR && $1 in s {print $0,s[$1]}' bb.txt cc.txt 
    a 11 10
    b 13 12
    

    这两种方法其实是一样的。

  • 相关阅读:
    70个经典的 Shell 脚本面试问题
    shell 知识点
    awk
    chinaunix-索引资料
    一篇文章学会shell工具篇之sed
    linux shell 之if-------用if做判断
    Python shell对比
    TortoiseGit功能介绍
    gitlab图形化使用教程 (mtm推荐)
    gitlab 服务器的搭建与使用全过程(一)
  • 原文地址:https://www.cnblogs.com/wujin/p/6117537.html
Copyright © 2011-2022 走看看