`
诗意的栖居
  • 浏览: 273754 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Linux Shell删除两个文件相同部分

阅读更多

转来的,原址http://www.cnblogs.com/raceblog/archive/2011/03/24/shell-delete-comm.html

因为在面试中遇到一个这样的问题,当时模模糊糊的,没有很确定的回答出来,后来上网查了一下结果,这里总结一下。

首先描述一下这个问题:比如两个文件file1和file2,删除两个文件中共同的部分,留下两个文件中独自有的部分。在网上找到一篇解决的答案,地址在这里http://hi.baidu.com/robertoyuan/blog/item/559483c4946ed5a78226acac.html。这里提到三种方法,但是没有给具体的解释。



    方法一:使用grep

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

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 -3 file1 file2

这个方法看起来最简单。命令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文件时无序的,输出的结果如下:
$ 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命令的使用,听牛人说可谓博大精深,我也没有太搞清楚。这里只是使用了一些简单的功能。下面以我自己的理解来解释一下上面的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个域的比较。
分享到:
评论

相关推荐

    linuxshell删除重复文件只保留一份.docx

    4. 文件比较:这个 Shellscript 展示了如何使用 `comm` 命令来比较两个文件的内容,并输出不同的部分。 5. xargs 命令:这个 Shellscript 展示了如何使用 `xargs` 命令来将文件名作为参数传递给其他命令。 详细解释...

    linux下shell命令大全

    例如,`cat -n file1 > file2`将`file1`的内容加上行号后重定向到`file2`,而`cat -b file1 file2 >> file3`则是将两个文件内容加上行号(不包含空白行)追加到`file3`。 2. `cd`命令: `cd`(change directory)...

    linux shell 中判断文件、目录是否存在的方法

    2. **diff命令**:使用`diff`命令比较两个文件的差异。如果输出为空,说明文件内容相同;如果有输出,则表明文件内容发生了变化。 总的来说,Linux Shell提供了丰富的工具和条件测试,使得在脚本中处理文件和目录的...

    shell + linux执行脚本 + linux基础知识 + linux系统基础

    - 批量更改:可以用来比较两个文件,如果hostname相同但IP不同,则更新IP地址。 6. **SHELL脚本应用**: - 添加用户:`adduser`或`useradd`命令可以创建新的系统用户。 - 移动和重命名文件:`mv`命令可以移动...

    linux命令和windows命令的区别

    * Linux 用户具有不同的权限,每个用户的权限都不相同,可以为任何用户分配任何权限 * Windows 用户一般只有管理员和普通用户和来宾用户等几种用户 Linux 命令和 Windows 命令是两种不同的操作系统中使用的命令集...

    shell编程.pdf

    2. **文件名一致性**: 脚本中使用了两种不同类型的文件扩展名(`.log` 和 `.logs`),可能导致部分文件未被处理。 针对这些问题,可以通过添加适当的错误处理机制来改进脚本,例如使用 `if` 语句来检查命令的退出...

    linux用户管理中两个重要的用户配置文件.pdf

    这两个文件在Linux用户管理和安全方面扮演着至关重要的角色。 首先,我们来看`/etc/passwd`文件。这是一个文本文件,其中包含了所有用户的基本信息,每行代表一个用户,字段之间用冒号(`:`)分隔。主要字段包括: 1...

    shll命令 支持文件列举ls,文件删除del,和文件拷贝cp命令

    在标准的Unix/Linux Shell中,"cp"命令有两个主要用法:一是复制单个文件,二是复制整个目录结构。在shll命令中,用户可以使用"cp"命令来复制一个文件到相同或不同的目录下。例如,"cp file1.txt newfile.txt"会创建...

    linux与unix shell编程指南part2

    11.1.18 将两个分类文件合并 110 11.2 系统sort 110 11.3 uniq用法 111 11.4 join用法 112 11.5 cut用法 114 11.5.1 使用域分隔符 115 11.5.2 剪切指定域 115 11.6 paste用法 116 11.6.1 指定列 116 11.6.2 使用不同...

    Linux最常用 150 个命令汇总

    - **功能说明**:按两个文件的相同字段合并。`join` 命令可以将两个文件按照某一列的共同字段合并在一起。 20. **tr** - **功能说明**:替换或删除字符。`tr` 命令可以用于替换文本中的字符,也可以用来删除字符,...

    将DOS批处理文件转换为Shell脚本.pdf

    总之,将DOS批处理文件转换为Shell脚本是一个涉及到两种不同命令语法理解的过程,通过理解各自的特点和对应关系,可以有效地进行转换。转换后的脚本通常能更好地利用Unix/Linux系统的强大功能,提高脚本的可读性和...

    常用Shell命令详解

    例如,`cat -v myfile`会显示文件中包含的控制字符,`cat myfile1 myfile2 > combined_file`将合并两个文件到一个新文件`combined_file`中。 3. `compress`:用于压缩文件,生成`.Z`后缀的压缩文件。`-v`选项提供...

    实验十三-shell脚本练习

    echo "两个文件都存在,且类型和操作权限都相等。" ``` 以上六个实验案例涵盖了从基础文件操作到条件逻辑判断、循环结构、函数定义等shell脚本的关键知识点,对于学习和掌握shell脚本编程非常有帮助。

    Linux操作系统复习题库

    硬链接指向文件的相同inode,两个链接文件看起来像独立的文件,但实际共享同一内容;符号链接则创建一个指向另一个文件的指针,类似Windows的快捷方式。 5. 权限“drw-r--r--”表示一个目录(因为第一个字符是'd')...

    shell常用命令整理

    - **功能**:显示文件内容或连接多个文件为单一输出。 - **用法**: - `cat file1`:显示文件`file1`的内容。 - `cat file1 file2 > file3`:将`file1`和`file2`的内容合并后输出到`file3`。 - **参数**: - `>`...

Global site tag (gtag.js) - Google Analytics