awk 对比两个文件中的数据项,输入到新文件

谢谢参与解答,awk相关问题。现有两个文件,内容样式如下1420862364.68503750365seq11608:130561420862364.7771305036... 谢谢参与解答,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点分数。
展开
 我来答
百度网友5311d79
推荐于2017-12-15 · TA获得超过1.9万个赞
知道大有可为答主
回答量:6356
采纳率:71%
帮助的人:3145万
展开全部

用awk数组来做。

awk 'ARGIND==1 {w[$2]=$1}
ARGIND==2 {
    flag=0;
    for(a in w)
        if($2==a) {
            flag=1;
            print $1,w[a],$2,$3,$4;
            break;
        }
    if(!flag)
        print $1,"x",$2,$3,$4
}' file2 file1


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

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

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

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

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

追问
谢谢解答,意思基本看懂了,但是在终端上运行没有结果,我尝试输出到file3,但是enter之后一瞬间就回到提示符了,file3是空文件。请再帮帮忙。
追答
dos2unix file1 file2
awk 'ARGIND==1 {w[$2]=$1}
ARGIND==2 {
    flag=0;
    for(a in w)
        if($2==a) {
            flag=1;
            print $1,w[a],$2,$3,$4;
            break;
        }
    if(!flag)
        print $1,"x",$2,$3,$4;
}' file2 file1 >file3

我本地试过没问题,所以怀疑是不是file1和file2的格式问题。先用dos2unix转一下格式看看。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式