找出两个文件内容的相同与不同
此文略有自己改动(DOOM)
1 comm命令
在我们的开发和运营中,特别是对业务进行监控的时候,我们常常需要写一些监控shell脚本,而这些脚本需要求两个文件的共同的记录列表或者只出现在第一个文件但不出现在第二个文件的记录列表的场景,此时,comm命令则是您解决此类问题的利器和助手。
随意man comm下,可以在linux下看到该命令的使用方法:
NAME
comm - compare two sorted files line by line
SYNOPSIS
comm [OPTION]... FILE1 FILE2
DESCRIPTION
Compare sorted files FILE1 and FILE2 line by line.
With no options, produce three-column output. Column one contains lines unique to FILE1, column two contains lines
unique to FILE2, and column three contains lines common to both files.
-1 suppress lines unique to FILE1
-2 suppress lines unique to FILE2
-3 suppress lines that appear in both files
--help display this help and exit
--version
output version information and exit
上面是英文说明,下面简单的说明如下:
一,利用comm命令进行处理的文件必须首先通过sort命令进行排序处理并且是unix格式而非dos格式的文本文件;
二,中文说明如下:
功能说明:比较两个已排过序的文件。(使用sort排序)
语 法:comm [-123][--help][--version][第1个文件][第2个文件]
补充说明:这项指令会一列列地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3栏显示:第1栏仅是在第1个文件中出现过的记录,第2栏是仅在第2个文件中出现过的记录,第3栏则是在第1与第2个文件里都出现过的记录。若给予的文件名改为"-",则comm指令会从标准输入设备读取数据。
参 数:
-1 不显示只在第1个文件里出现过的列。
-2 不显示只在第2个文件里出现过的列。
-3 不显示只在第1和第2个文件里出现过的列。
--help 在线帮助。
--version 显示版本信息。
例子
comm - 12 就只显示在两个文件中都存在的行;
comm - 23 只显示在第一个文件中出现而未在第二个文件中出现的行;
comm - 123 则什么也不显示。
例如:找出a.txt文件有而b.txt文件中没有的放在c.txt文件中
- #!/bin/sh
- # author by tianmo
- # date 2011-11-21 20:33
- #BEGIN
- cat a.txt | sort | uniq | sort > a_u.txt
- cat b.txt | sort | uniq | sort > b_u.txt
- comm -23 a_u.txt b_u.txt > c.txt
- # END
2 diff命令
功能说明:比较文件的差异。
语 法:diff [-abBcdefHilnNpPqrstTuvwy][-<行数>][-C <行数>][-D <巨集名称>][-I <字符或字符串>][-S <文件>][-W <宽度>][-x <文件或目录>][-X <文件>][--help][--left-column][--suppress-common-line][文件或目录1][文件或目录2]
补充说明:diff以逐行的方式,比较文本文件的异同处。所是指定要比较目录,则diff会比较目录中相同文件名的文件,但不会比较其中子目录。
参 数:
-<行数> 指定要显示多少行的文本。此参数必须与-c或-u参数一并使用。
-a或--text diff预设只会逐行比较文本文件。
-b或--ignore-space-change 不检查空格字符的不同。
-B或--ignore-blank-lines 不检查空白行。
-c 显示全部内文,并标出不同之处。
-C<行数>或--context<行数> 与执行"-c-<行数>"指令相同。
-d或--minimal 使用不同的演算法,以较小的单位来做比较。
-D<巨集名称>或ifdef<巨集名称> 此参数的输出格式可用于前置处理器巨集。
-e或--ed 此参数的输出格式可用于ed的script文件。
-f或-forward-ed 输出的格式类似ed的script文件,但按照原来文件的顺序来显示不同处。
-H或--speed-large-files 比较大文件时,可加快速度。
-l<字符或字符串>或--ignore-matching-lines<字符或字符串> 若两个文件在某几行有所不同,而这几行同时都包含了选项中指定的字符或字符串,则不显示这两个文件的差异。
-i或--ignore-case 不检查大小写的不同。
-l或--paginate 将结果交由pr程序来分页。
-n或--rcs 将比较结果以RCS的格式来显示。
-N或--new-file 在比较目录时,若文件A仅出现在某个目录中,预设会显示:
Only in目录:文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-p 若比较的文件为C语言的程序码文件时,显示差异所在的函数名称。
-P或--unidirectional-new-file 与-N类似,但只有当第二个目录包含了一个第一个目录所没有的文件时,才会将这个文件与空白的文件做比较。
-q或--brief 仅显示有无差异,不显示详细的信息。
-r或--recursive 比较子目录中的文件。
-s或--report-identical-files 若没有发现任何差异,仍然显示信息。
-S<文件>或--starting-file<文件> 在比较目录时,从指定的文件开始比较。
-t或--expand-tabs 在输出时,将tab字符展开。
-T或--initial-tab 在每行前面加上tab字符以便对齐。
-u,-U<列数>或--unified=<列数> 以合并的方式来显示文件内容的不同。
-v或--version 显示版本信息。
-w或--ignore-all-space 忽略全部的空格字符。
-W<宽度>或--width<宽度> 在使用-y参数时,指定栏宽。
-x<文件名或目录>或--exclude<文件名或目录> 不比较选项中所指定的文件或目录。
-X<文件>或--exclude-from<文件> 您可以将文件或目录类型存成文本文件,然后在=<文件>中指定此文本文件。
-y或--side-by-side 以并列的方式显示文件的异同之处。
--help 显示帮助。
--left-column 在使用-y参数时,若两个文件某一行内容相同,则仅在左侧的栏位显示该行内容。
--suppress-common-lines 在使用-y参数时,仅显示不同之处。
例如: 找出a.txt文件有而b.txt文件中没有的放在c.txt文件中
- #!/bin/sh
- # author by tianmo
- # date 2011-11-21 20:33
- #BEGIN
- cat a.txt | sort | uniq | sort > a_u.txt
- cat b.txt | sort | uniq | sort > b_u.txt
- diff a_u.txt b_u.txt | grep /< | awk ' $1 = " " ' > c.txt
- # END
3 Linux系统下比较两个文件并删除相同部分
方法一:
comm -23 file1 file2 方法二: grep -v -f file1 file2 /*注::此法在对比数字时候比较凑效果,文本对比不建议使用*/ 方法三: 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 |
4 Linux Shell删除两个文件相同部分
因为在面试中遇到一个这样的问题,当时模模糊糊的,没有很确定的回答出来,后来上网查了一下结果,这里总结一下。首先描述一下这个问题:比如两个文件file1和file2,删除两个文件中共同的部分,留下两个文件中独自有的部分。在网上找到一篇解决的答案,地址在这里http://hi.baidu.com/robertoyuan/blog/item/559483c4946ed5a78226acac.html。这里提到三种方法,但是没有给具体的解释。
方法一:使用grep
grep命令的详细使用方法,可以参考man,这里有一个简单实用的介绍:http://linux.ccidnet.com/art/3067/20070313/1035613_1.html。在方法一中,用到了两个参数。参数-v,表示invert match,即反向匹配,输出没有匹配上的项。参数-f,表示从文件中读取匹配模板(pattern)。方法一中的前一部分,在文件file1中匹配模板,来反向匹配文件file2中的内容,即输出文件file2中,在file1中没有的内容。后面的一部分同理可得,输出文件file1中,在file2中没有的内容。
方法二:实用comm
这个方法看起来最简单。命令comm的功能就是,逐行比较两个排好序的文件,默认输出有三列:只在file1中有的行、只在file2中有的行、在file1和file2中共有的行。有参数-1 -2 -3,分别来抑制输出对应的列。例如在我们的方法二中,实用-3参数,不输出file1和file2中共有的部分。即能达到我们本文的目的。
但是注意到,comm比较排好序的两个文件,comm在处理文件的时候,首先要查看文件是否有序,例如file1和file2的内容如下:
- $cat file1
- line1
- line2
- line3
- $cat file2
- line0
- line1
- line3
- line2
调用前面方法二的命令的时候,就会提示file2文件时无序的,输出的结果如下:
line0
line2
comm: file 2 is not in sorted order
line2
如果使用--nocheck-order参数,不进行有序性检测,结果如下:
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命令的使用,听牛人说可谓博大精深,我也没有太搞清楚。这里只是使用了一些简单的功能。下面以我自己的理解来解释一下上面的shell代码。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个域的比较。
grep -xf file1 file2
补充的重要内容:
1、统计两个文本文件的相同行
grep -Ff file1 file2
2、统计file1中有,file2中没有的行
grep -vFf file1 file2
grep -Fvxf <(grep -Fxf file1 file2 ) file1 file2
如何比较两个文件并去删除相同的内容
for i in $(<file1); do grep $i file2 || echo $i >>tmp1 ; done
输出相同行:
$grep -wf file1 file2
输出不同行
$grep -wvf file1 file2
找出两个文件内容的相同与不同相关推荐
- linux之找出两个文件里面相同的数据
1 问题 找出2个文件里面重复的数据(这个问题是csdn排名第一的大神stpeace的专栏在微信里面和我的交流,我当时一脸懵逼) 文件a.txt文件内容如下 cat a.txt 123 123 234 ...
- 程序员面试金典——解题总结: 9.18高难度题 18.5有个内含单词的超大文本文件,给定任意两个单词,找出在这个文件中这两个单词的最短距离
#include <iostream> #include <stdio.h> #include <vector> #include <string> # ...
- 表格字体缩小 php_如何快速找出两个Excel表格不同的地方?
上一篇文章介绍了如何快速找出两个word文档不同的地方,这篇文章来说说如何快速找出两个Excel表格不同的地方,这里说的两个Excel表格,可以是同一个工作簿的不同sheet,也可以是两个不同的Exc ...
- 快速找出两个Word文档之间的差别
我们经常会遇到这样的问题:两份Word文件之中,只有一些极为细小的区别,如果单纯通过人工的方法去进行校对,那么不仅效率很低,而且也容易出错,容易漏掉一些不太明显的区别.Word 2003已经内置了一个 ...
- jq 比较两个时间是否在同一天_.NET CORE下最快比较两个文件内容是否相同的方法...
最近项目有个需求,需要比较两个任意大小文件的内容是否相同,要求如下: 项目是.NET CORE,所以使用C#进行编写比较方法 文件大小任意,所以不能将文件内容全部读入到内存中进行比较(更专业点说,需要 ...
- .NET CORE下最快比较两个文件内容是否相同的方法
最近项目有个需求,需要比较两个任意大小文件的内容是否相同,要求如下: 项目是.NET CORE,所以使用C#进行编写比较方法 文件大小任意,所以不能将文件内容全部读入到内存中进行比较(更专业点说,需要 ...
- php 随机两位小数数_使用8086微处理器找出两个8位N数数组
php 随机两位小数数 Problem statement: 问题陈述: Write a program in 8086 microprocessor to find out the sum of t ...
- 找出两个字符串中最大子字符串,如abractyeyt,dgdsaeactyey的最大子串为actyet
// 最大子字符串.cpp : 定义控制台应用程序的入口点. // //找出两个字符串中最大子字符串,如"abractyeyt","dgdsaeactyey"的 ...
- 找出两个字符串中最长的相同子字符串
//找出两个字符串中最长的相同子字符串public class Stringdemo {public static void main(String[] args) {String str1 = ne ...
最新文章
- 【数据结构与算法】之深入解析“二叉树的层序遍历”的求解思路与算法示例
- 单耳蓝牙耳机怎么连接_蓝牙耳机怎么挑选?推荐性价比高的蓝牙耳机
- MySQL 修改字段
- 2020年,RocketMQ面试题 -面试题驱动RocketMQ学习
- git钩子放服务器_Git代码自动化部署、Hook、钩子
- virtualbox谨记:续....
- 双重释放漏洞(来自漏洞战争一书)
- 小白如何准备数学建模——以美赛为列
- android全局屏幕自动旋转,如何在Android中全局强制屏幕方向?
- 阿兹卡班(azikaban)报错:syntax error:unexpected end of file
- 同步电机模型的MATLAB仿真模型
- java apache commons_Apache commons(Java常用工具包)简介
- 使用kail中Metasploit获取Windows的权限并提权
- CFG保护机制校验逻辑分析
- 驱动篇 -- PMOS管应用
- 机考怎么作弊_电脑上考试如何作弊 电脑上考试不能复制粘贴怎么办
- 组图:1912年斯德哥尔摩奥运会
- CLOUD 云计算进阶(一)-云平台搭建与虚拟化服务
- LeetCode-378.有序矩阵中第k小的元素、二分查找
- Python实用模块(二十一)base64
热门文章
- 纤亿通生产高工专业解说——彩光模块灰光模块制造工艺及参数
- 计算机是如何进行计算的?(一)
- “Catch That Cow“
- Ubuntu20.04环境上在LXC内安装FRR
- XMLHTTP中setRequestHeader()简单分析
- PHP生成二维码并添加文字(phpqrcode类)
- 大专计算机类英语翻译,专科英文(大学专科用英文怎么说)
- 01背包,完全背包,多重背包的个人总结
- linux c语言结构体初始化,Linux c中 结构体初始化方式
- 算法入门 12.二叉搜索树