shell学习之按照某列合并两个文件

有两个文件:ip_city_location.file 有三个字段存放的是ip,城市和地点。
211.82.96.2  北京  海淀区
211.82.96.3  北京  朝阳区
211.82.96.5  南阳  卧龙区
10.1.18.7  郑州  新郑
文件ip.file中有一个字段存放的是ip
10.1.18.7
211.82.96.5
现在要求输出ip.file中的每个ip对应的城市。
解决办法:使用join命令。
注意: 在使用join前,需要将两个文件按照相同的规则进行排序,这样才能使用join达到期望的效果
故代码如下:
#!/bin/bash 
filenameBeforSort1="ip_city_location.file"
filenameBeforSort2="ip.file"
sortedFile1="ip_city_location.sort"
sortedFile2="ip.sort"
sort $filenameBeforSort1 > $sortedFile1
sort $filenameBeforSort2 > $sortedFile2
join $sortedFile1 $sortedFile2 | awk '{print $1,$2}'
运行结果如下:
10.1.18.7 郑州
211.82.96.5 南阳
现问题发生了一些变化,ip_city_location.file和ip.file中均有重复的记录。ip_city_location.file内容如下:
211.82.96.2  北京  海淀区
211.82.96.3  北京  朝阳区
211.82.96.5  南阳  卧龙区
211.82.96.3  北京  朝阳区
10.1.18.7 郑州  新郑
211.82.96.2  北京  海淀区
10.1.18.7 郑州  新郑
ip.file的内容变为如下:
10.1.18.7
211.82.96.5
10.1.18.7
211.82.96.5
则需要进行去重的工作。可以在join之前对两个文件排序时直接去重,也可以join之后再去重。个人认为排序前去重可能效率更高一点。
join前去重:
#!/bin/bash 
filenameBeforSort1="ip_city_location.file"
filenameBeforSort2="ip.file"
sortedFile1="ip_city_location.sort"
sortedFile2="ip.sort"
sort $filenameBeforSort1 | uniq | sort > $sortedFile1 #第二个sort命令不写效果也一样,但是个人认为加上更保险一些,不过数据量大时也许会影响效率 
sort $filenameBeforSort2 |uniq | sort > $sortedFile2 #第二个sort命令不写效果也一样,但是个人认为加上更保险一些,不过数据量大时也许会影响效率 
join $sortedFile1 $sortedFile2 | awk '{print $1,$2}'
运行结果如下:
10.1.18.7 郑州
211.82.96.5 南阳
join之后去重:
#!/bin/bash 
filenameBeforSort1="ip_city_location.file"
filenameBeforSort2="ip.file"
sortedFile1="ip_city_location.sort"
sortedFile2="ip.sort"
sort $filenameBeforSort1 > $sortedFile1
sort $filenameBeforSort2 > $sortedFile2
join $sortedFile1 $sortedFile2 | awk '{print $1,$2}' | sort | uniq  #在做uniq命令之前是必须先执行sort命令的
运行结果如下:
10.1.18.7 郑州
211.82.96.5 南阳
本文仅仅针对这一个例子的实际解决过程进行了描述,其中使用的是join,sort和uniq命令的简单用法。
join命令,就相当于数据库中的内连接,不指定任何参数的情况下,默认按第一列合并,关键字不匹配的行不会输出。sort命令不指定任何参数的情况下,默认按第一列排序。
join命令还可以指定按照其它列合并。当然对应的,sort的时候也要按指定的列sort才可以达到效果。


  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值