zoukankan      html  css  js  c++  java
  • awk 对比两个文件中的数据项,输入到新文件

    http://zhidao.baidu.com/link?url=hdKrZSO1MeW_CFUfMtDBY1aOYs5u1JwxISH5y7akigSacoH15lyThYNwYfoh1xMv0DF1Y5ngLnGcpgrq0IVznI1uLcnGy5ugMyi5lnlMd9_

    谢谢参与解答,awk相关问题。
    现有两个文件,内容样式如下
    
    1420862364.685037 50365 seq 11608:13056
    1420862364.777130 50366 seq 13056:14504
    1420862364.777142 50367 seq 14504:15952
    1420862364.778324 50368 seq 15952:17400
    1420862364.778332 50369 seq 17400:18848
    1420862364.780798 50370 seq 18848:20296
    1420862364.780810 50371 seq 20296:21744
    省略x万行
    
    第一列是时间(unix),第二列是ip数据包id,第三列是数据包类型,第四列是数据包内数据序列号。
    文件file1来自发信端,文件file2来自收信端,因此两个文件中的数据大致类似,除了file2的时间部分可能会有迟延上的变化,而且某些时候会因为丢包,部分数据行丢失。
    
    现在要求,对比file1和file2,根据id列区分数据包,输出file1中的时间1和file2中的时间2到新文件,样式如下
    1420862364.881564 1420862365.881564 50391 seq 49256:50704
    对于丢包(即file2中没有找到与file1中相同id行的情况),在time2的位置上输出x字样
    1420862364.881564 x 50391 seq 49256:50704
    要求写出简单的处理思路,带适当注释,用awk实现。
    全部符合条件的加20点分数。
    ++++++++++++++++++++++++++++

    用awk数组来做。

    点击(此处)折叠或打开

    1. awk 'ARGIND==1 {w[$2]=$1}
    2. ARGIND==2 {
    3.     flag=0;
    4.     for(a in w)
    5.         if($2==a) {
    6.             flag=1;
    7.             print $1,w[a],$2,$3,$4;
    8.             break;
    9.         }
    10.     if(!flag)
    11.         print $1,"x",$2,$3,$4
    12. }' file2 file1

    ARGIND==1 表示处理的是第一个文件 file2

    ARGIND==2 表示处理的是第二个文件 file1

    原则是:内容较少的文件先处理,遍历读入并保存到数组,以要比较的值为数组下标(这里就是第二列的id值),需要打印显示的内容存为对应的元素值(这里就是第一列的时间值)。然后再处理内容较多的文件,对其每一行内容都使用for循环遍历数组下标进行比较。

    这里设置了一个flag来标识file1中的id在数组中(file2中)是否存在。

    由于你的数据文件有上万行,所以速度肯定快不了。


    追问:
    谢谢解答,意思基本看懂了,但是在终端上运行没有结果,我尝试输出到file3,但是enter之后一瞬间就回到提示符了,file3是空文件。请再帮帮忙。
    追答:

    点击(此处)折叠或打开

    1. dos2unix file1 file2
    2. awk 'ARGIND==1 {w[$2]=$1}
    3. ARGIND==2 {
    4.     flag=0;
    5.     for(a in w)
    6.         if($2==a) {
    7.             flag=1;
    8.             print $1,w[a],$2,$3,$4;
    9.             break;
    10.         }
    11.     if(!flag)
    12.         print $1,"x",$2,$3,$4;
    13. }' file2 file1 >file3
    我本地试过没问题,所以怀疑是不是file1和file2的格式问题。先用dos2unix转一下格式看看。






    <script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
    阅读(68) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~
    评论热议
  • 相关阅读:
    【读书笔记】房龙-人类的故事
    【读书笔记】曼昆-经济学原理:宏观经济学分册
    【读书笔记】曼昆-经济学原理:微观经济学分册
    ES6数组去重
    switch语句
    if语句的优化
    程序的三大结构
    NaN
    js中常见的数据类型
    变量的命名规则
  • 原文地址:https://www.cnblogs.com/ztguang/p/12649298.html
Copyright © 2011-2022 走看看