- 浏览: 268195 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
Xujian0000abcd:
说的太好啦~赞一个~
shell if语句中的并列 -
Jimmy.song:
终于在楼主这里找到答案,很受益,谢谢~
使用diff或者vimdiff比较远程文件(夹)与本地文件(夹)
转来的,原址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个域的比较。
发表评论
-
shell 查找文件中包含中文的行
2012-08-15 14:32 2902awk '/[^!-~]/' file asscii码从!到 ... -
Linux Shell for循环写法总结
2012-07-05 15:48 2317关于shell中的for循环用法很多,一直想总结一下,今天网上 ... -
保留字符串中的数字,其它全去掉
2012-03-15 11:26 3513把2007.10.30 16:00:00去掉".&q ... -
sed 用法解释
2011-10-28 14:29 9551.Sed命令 调用sed命令有 ... -
df 和 du 命令详解
2011-09-27 14:59 959df命令详细用法 a:显 ... -
shell tr命令的使用
2011-09-15 10:30 44644tr是translate的简写,亦 ... -
Useful Shell Option – extglob 和 shopt命令
2011-09-14 10:45 3347Bash Shell有个extglob选项 ... -
source命令
2011-09-06 16:45 1225source [filename] 不再产 ... -
Bash 自带的字符截断功能
2011-09-02 15:51 1138如果是一般路径的字符截断可以用basename和dirname ... -
Du命令功能说明
2011-08-24 10:01 955Du命令功能说明:统计 ... -
环境变量
2011-08-22 16:58 772配置环境变量一般需要两个文件 举例: 第一个文件,文件名.p ... -
shell 小括号的问题
2011-08-09 18:09 2397http://www.linuxsir.org/bbs/thr ... -
使用diff或者vimdiff比较远程文件(夹)与本地文件(夹)
2011-08-09 14:53 7964方法1:管道给diff $ssh eric@192.168 ... -
shell里面的特殊字符
2011-08-05 17:15 5071常见的有美元符号($),反斜线(\)和引号。 1。美元符号 ... -
shell 打开文件
2011-08-04 17:43 5704我们都知道shell语句可以执行主程序打开某一文件,比如c:盘 ... -
shell 读取文章行数
2011-08-04 17:42 1060总结了一下有六种方法: 现在有一个a文件,共有55行 ... -
shell uniq
2011-07-22 17:51 1567uniq 命令 文字 uniq是LINUX命令 ... -
shell if语句中的并列
2011-07-21 17:38 29373格式如下,在比较时,数字和字符串用不同的比较符号 1.如果a ... -
shell判断:数值、字符串、文件
2011-07-21 17:34 2246(1)数值测试: -eq 等于则为真。 -ne 不 ... -
shell 有关命令行参数
2011-07-21 17:32 2069通常调用UNIX程序的格式是: command options ...
相关推荐
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 使用不同...
umount命令的作用是卸载一个文件系统,它的使用权限是超级用户或/etc/fstab中允许的使用者。 2.格式 unmount -a [-fFnrsvw] [-t vfstype] [-n] [-rw] [-F] device dir 3.使用说明 umount 命令是mount命令...
建立硬连接实际上只是增加了一个目录项,但并没有复制文件数据区,原文件的数据区由两个文件共享。这一方面能够节约大量磁盘空间,同时可以保证两个文件能同步更新。 ls -i或--inode 显示文件和目录的inode编号。 ...
这几个文件的内容在后面会做详细介绍。 Linux提供了集成的系统管理工具userconf,它可以用来对用户账号进行统一管理。 如果一个用户的账号不再使用,可以从系统中删除。删除用户账号就是要将/etc/passwd等系统...
fc one.txt two.txt > 3st.txt 对比二个文件并把不同之处输出到3st.txt文件中,"> "和"> >" 是重定向命令 at id号 开启已注册的某个计划任务 at /delete 停止所有计划任务,用参数/yes则不需要确认就直接停止 at ...
>比较合并两个文件 >在文件比较窗口中直接编辑文件 >当文件内容改变时文件比较窗口自动更新比较结果 >在文件比较窗口中查找/替换 >查找上一个/下一个不同的文本块 >将所有相同/不同的行拷贝到剪贴板。通过这个功能,...
diff file1 file2 比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的 comm file1 file2 比较文件,显示两个文件不相同的内容 23.命令ln——...
分成两个分卷进行压缩 《Ubuntu权威指南》目录 目 录 第1章 系统概述与安装 1 1.1 Linux的兴起与发展 2 1.2 充分利用网上资源 3 1.2.1 Ubuntu官方网站 3 1.2.2 GNU网站 4 1.2.3 Linux文档项目网站 4 1.2.4 网上...
分成两个分卷进行压缩 《Ubuntu权威指南》目录 目 录 第1章 系统概述与安装 1 1.1 Linux的兴起与发展 2 1.2 充分利用网上资源 3 1.2.1 Ubuntu官方网站 3 1.2.2 GNU网站 4 1.2.3 Linux文档项目网站 4 1.2.4 网上...
合并两个文件的行 link 创建从指定文件到指定名称的硬链接 ln 创建文件之间的硬/软(符号)连接 logname 显示当前用户的登录名 ls 列出指定目录的所有内容。缺省是将文件和子目录按字母顺序排列。 md5sum ...
Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。 Beta 版 的 Android SDK 提供了在 Android 平台上使用 JaVa 语言进行 Android 应用开发必须的工具和 API 接口。 特性 ...
每个shell命令的进程号通常是不同的,为了每次调用$$时得到的进程号相同,必须把这4行放在一条命令中,这里用分号把它们连接成一条命令(在书写时为了易读,用\拆成了多行),这样每次.$$便是同一个文件了。...
有两个提高日志保留的 DB2 特性:双日志记录和用户出口工具,已在关于数据库复制 HA 选项的部分中进行了讨论。 5. 灾难恢复方案 灾难恢复方案可以分成三类:简单备份、备份和日志保留、高级存储备份 。 虽然不是每...
两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,其实代码很简单,希望对你有帮助。 Message-Driven Bean ...
Axx:ARJ压缩文件的分包序号文件,用于将一个大文件压至几个小的压缩包中(xx取01-99的数字) A3L:Authorware 3.x库文件 A4L:Authorware 4.x库文件 A5L:Authorware 5.x库文件 A3M,A4M:Authorware Macintosh...
在“部分中处理了这两个命令之间的差异。 本地与全球 本地放克使用隐藏数据库文件存储,该文件位于创建放克的同一目录中。 可以使用上述的动作命令选项来操纵它们。 创建后,只要您已激活提供的外壳扩展程序(请...
上篇基本上是第一版的修订,只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因,在本书第 2章有比较详细的说明。当然,开发环境...
上篇基本上是第一版的修订,只是做了一个调整,那便是在兼顾 Windows和Linux两方面用户的基础上,默认在Linux下建立开发环境来编写我们的操作系统。至于这样做的原因,在本书第 2章有比较详细的说明。当然,开发环境...
Java右键弹出菜单源码 简单 Java圆形按钮实例代码,含注释 两个目标文件,自绘button。 Java圆形电子时钟源代码 1个目标文件 内容索引:JAVA源码,系统相关,电子钟 用JAVA编写的指针式圆形电子钟,效果图如下所示,...