Shell比较两个文本

shell比较两个文件: 

#!/bin/bash

file1=/root/media/updateDir/version
file2=/root/updateDir/version

diff $UPDATE_VERSION$UPDATE_ROOTVERSION> /dev/null
if [ $0 == 0 ]; then
    echo "Both file are same"
else
    echo "Both file are different"
fi

$0 是上一执行命令的返回值。

 diff 命令返回值为 0,说明两个文件相同, 否则两个文件不相同。

扩展一个问题:

       比如有两个文件file1和file2,删除两个文件的删除两个文件中共同的部分,留下两个文件中独自有的部分。在网上找到一篇解决的答案,地址在这里如流,新一代智能工作平台。这里提到三种方法,但是没有给具体的解释。

方法一:使用grep

grep -v -f file1 file2 && grep -v -f file2 file1

 grep命令的详细用法,可以参考http://linux.ccidnet.com/art/3067/20070313/1035613_1.html

       在方法一中,用到了两个参数。参数 -v 表示invert match,即反向输出,输出没有匹配上的项。参数-f,表示从文件中读取模板(pattern)。方法一中的前一部分,在文件file1中匹配模板来反向匹配文件file2中的内容,即输出文件file2中,在file1中没有内容。后面的一部分同理可得,输出文件file1中在file2 没有的内容。

方法二:使用comm

comm -3 file1 file2

       这个方法看起来简单。命令comm的功能就是逐行比较两个排序好的文件,默认输出有三列:只在file1中有的行,只在file2中有的行,file1和file2中共同有的部分。即可达到想要的状态。但是,注意到,comm比较排好序的两个文件,comm在处理文件的时候,首先要查看文件是否有序,例如:

$cat file1
line1
line2
line3 

$cat file2
line0
line1
line3
line2

调用前面方法二的命令时,就会显示file2 文件是无序的,输出结果如下:

$ comm -3 file1 file2
        line0
line2
comm: file 2 is not in sorted order
        line2

如果使用--nocheck-order参数,不进行有序性检测,结果如下:

$ comm -3 --nocheck-order file1 file2
        line0
line2

        line2

       从这个结果中我们可以看到,这还不是我们真正想要的结果。这里可体现comm的另一个特征,就是逐行比较。它是对file1和file2进行逐行往下的比较,检测是否相同。所以,在用comm的时候,要根据具体的情况进行分析了。

方法三:使用awk

awk '{print NR, $0}' file1 file2 |sort -k2|uniq -u -f 1|sort -k1|awk '{print $2}'
或者:
awk '{print $0}' file1 file2 |sort|uniq -u

awk命令的使用,听牛人说可谓博大精深,我也没听懂,这里是简单的自我理解:

awk就是文本的解释器和过滤器。awk把每一行看成是一个记录(record),每个记录使用分隔符(默认是空格)把每条记录分成若干域。awk内置参数$0表示整行,$1,$2...分别表示各域,内置参数NR,表示记录的计数,awk '{print NR, $0}' file1 file2表示依次读取file1 file2,打印出每行,并且在前面添加行号。命令sort,就是对行进行排序,参数-k表示根据各行的第几个参数关键字开始进行排序,这里-k2表示根据第二个关键字开始进行排序。

命令uniq,进行报告或者忽略重复行,参数-u,表示只打印出唯一的行(unique lines),-f表示忽略的每行的前n个域的比较。

参考网址:shell比较两个文件 - hotty - 博客园 (cnblogs.com)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值