Chinaunix首页 | 论坛 | 博客
  • 博客访问: 433967
  • 博文数量: 62
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 740
  • 用 户 组: 普通用户
  • 注册时间: 2015-05-10 21:59
个人简介

付出,终有回报!

文章分类

全部博文(62)

文章存档

2018年(6)

2017年(24)

2016年(6)

2015年(26)

分类: LINUX

2015-09-18 23:08:40

有如下两个文件:
# cat input1                                 
id,name,sex                                 
1,tom,m                                      
4,luks,m                                       
6,davd,m                                      
3,kathy,f                                       
                                                    
#cat input2
id,name,addr
1,tom,beijing
2,lily,shannxi
3,khy,shanghai
4,luks,hunan
5,devd,zhejiang
以id为键值对两个文件进行联接,只输出两个文件中的id值都存在的行,且,若两个文件中的id相同,但name值不同时,给出冲突提示。
联接后的文件如下:
id,name,sex,addr
1,tom,m,beijing
4,luks,m,hunan
3,khy and kathy are conflict!

具体脚本实现如下:

点击(此处)折叠或打开

  1. #!/bin/bash
  2. file1=/mnt/test/input1       #指定文件的路径
  3. file2=/mnt/test/input2
  4. n=`cat $file1 |wc -l`        #以其中任意一个文件作为基准,逐行的进行处理

  5. for((i=1;i<=$n;i++))         
  6. do
  7.   line2=`head -n $i $file1 |tail -n 1`      #截取文件每一行的内容
  8.   id2=`head -n $i $file1 |tail -n 1 | awk -F "," '{print $1}'`           #从截取的文件行中,在截取除id,name
  9.   name2=`head -n $i $file1 |tail -n 1 | awk -F "," '{print $2}'`

  10.   id1=`grep $id2 $file2 | awk -F "," '{print $1}'`                       #以上文中截取的id值为关键字,在另一个文件中匹配相应的行,并截取id,name
  11.   name1=`grep $id2 $file2 | awk -F "," '{print $2}'`

  12.   if [ "$id1" = "$id2" ]                      
  13.   then
  14.   sex=`grep $id2 $file2 | awk -F "," '{print $3}'`
  15.     if [ "$name1" = "$name2" ]            #若两个文件的id,name字段都匹配,则进行联接显示
  16.     then
  17.        echo "$line2,$sex"
  18.     else
  19.        echo -e "\033[34m$id1,$name1 and $name2 are conflict!\033[0m"     
  20.     fi
  21.   fi
  22. done
若原始文件是乱序的,则可以先对文件进行排序,在进行如上的脚本处理过程。
阅读(1806) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~