- 浏览: 273888 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
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 2961awk '/[^!-~]/' file asscii码从!到 ... -
Linux Shell for循环写法总结
2012-07-05 15:48 2358关于shell中的for循环用法很多,一直想总结一下,今天网上 ... -
保留字符串中的数字,其它全去掉
2012-03-15 11:26 3588把2007.10.30 16:00:00去掉".&q ... -
sed 用法解释
2011-10-28 14:29 9981.Sed命令 调用sed命令有 ... -
df 和 du 命令详解
2011-09-27 14:59 998df命令详细用法 a:显 ... -
shell tr命令的使用
2011-09-15 10:30 44724tr是translate的简写,亦 ... -
Useful Shell Option – extglob 和 shopt命令
2011-09-14 10:45 3409Bash Shell有个extglob选项 ... -
source命令
2011-09-06 16:45 1267source [filename] 不再产 ... -
Bash 自带的字符截断功能
2011-09-02 15:51 1181如果是一般路径的字符截断可以用basename和dirname ... -
Du命令功能说明
2011-08-24 10:01 1001Du命令功能说明:统计 ... -
环境变量
2011-08-22 16:58 811配置环境变量一般需要两个文件 举例: 第一个文件,文件名.p ... -
shell 小括号的问题
2011-08-09 18:09 2426http://www.linuxsir.org/bbs/thr ... -
使用diff或者vimdiff比较远程文件(夹)与本地文件(夹)
2011-08-09 14:53 8045方法1:管道给diff $ssh eric@192.168 ... -
shell里面的特殊字符
2011-08-05 17:15 5111常见的有美元符号($),反斜线(\)和引号。 1。美元符号 ... -
shell 打开文件
2011-08-04 17:43 5766我们都知道shell语句可以执行主程序打开某一文件,比如c:盘 ... -
shell 读取文章行数
2011-08-04 17:42 1105总结了一下有六种方法: 现在有一个a文件,共有55行 ... -
shell uniq
2011-07-22 17:51 1616uniq 命令 文字 uniq是LINUX命令 ... -
shell if语句中的并列
2011-07-21 17:38 29536格式如下,在比较时,数字和字符串用不同的比较符号 1.如果a ... -
shell判断:数值、字符串、文件
2011-07-21 17:34 2308(1)数值测试: -eq 等于则为真。 -ne 不 ... -
shell 有关命令行参数
2011-07-21 17:32 2133通常调用UNIX程序的格式是: command options ...
相关推荐
4. 文件比较:这个 Shellscript 展示了如何使用 `comm` 命令来比较两个文件的内容,并输出不同的部分。 5. xargs 命令:这个 Shellscript 展示了如何使用 `xargs` 命令来将文件名作为参数传递给其他命令。 详细解释...
例如,`cat -n file1 > file2`将`file1`的内容加上行号后重定向到`file2`,而`cat -b file1 file2 >> file3`则是将两个文件内容加上行号(不包含空白行)追加到`file3`。 2. `cd`命令: `cd`(change directory)...
2. **diff命令**:使用`diff`命令比较两个文件的差异。如果输出为空,说明文件内容相同;如果有输出,则表明文件内容发生了变化。 总的来说,Linux Shell提供了丰富的工具和条件测试,使得在脚本中处理文件和目录的...
- 批量更改:可以用来比较两个文件,如果hostname相同但IP不同,则更新IP地址。 6. **SHELL脚本应用**: - 添加用户:`adduser`或`useradd`命令可以创建新的系统用户。 - 移动和重命名文件:`mv`命令可以移动...
* Linux 用户具有不同的权限,每个用户的权限都不相同,可以为任何用户分配任何权限 * Windows 用户一般只有管理员和普通用户和来宾用户等几种用户 Linux 命令和 Windows 命令是两种不同的操作系统中使用的命令集...
2. **文件名一致性**: 脚本中使用了两种不同类型的文件扩展名(`.log` 和 `.logs`),可能导致部分文件未被处理。 针对这些问题,可以通过添加适当的错误处理机制来改进脚本,例如使用 `if` 语句来检查命令的退出...
这两个文件在Linux用户管理和安全方面扮演着至关重要的角色。 首先,我们来看`/etc/passwd`文件。这是一个文本文件,其中包含了所有用户的基本信息,每行代表一个用户,字段之间用冒号(`:`)分隔。主要字段包括: 1...
在标准的Unix/Linux Shell中,"cp"命令有两个主要用法:一是复制单个文件,二是复制整个目录结构。在shll命令中,用户可以使用"cp"命令来复制一个文件到相同或不同的目录下。例如,"cp file1.txt newfile.txt"会创建...
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 使用不同...
- **功能说明**:按两个文件的相同字段合并。`join` 命令可以将两个文件按照某一列的共同字段合并在一起。 20. **tr** - **功能说明**:替换或删除字符。`tr` 命令可以用于替换文本中的字符,也可以用来删除字符,...
总之,将DOS批处理文件转换为Shell脚本是一个涉及到两种不同命令语法理解的过程,通过理解各自的特点和对应关系,可以有效地进行转换。转换后的脚本通常能更好地利用Unix/Linux系统的强大功能,提高脚本的可读性和...
例如,`cat -v myfile`会显示文件中包含的控制字符,`cat myfile1 myfile2 > combined_file`将合并两个文件到一个新文件`combined_file`中。 3. `compress`:用于压缩文件,生成`.Z`后缀的压缩文件。`-v`选项提供...
echo "两个文件都存在,且类型和操作权限都相等。" ``` 以上六个实验案例涵盖了从基础文件操作到条件逻辑判断、循环结构、函数定义等shell脚本的关键知识点,对于学习和掌握shell脚本编程非常有帮助。
硬链接指向文件的相同inode,两个链接文件看起来像独立的文件,但实际共享同一内容;符号链接则创建一个指向另一个文件的指针,类似Windows的快捷方式。 5. 权限“drw-r--r--”表示一个目录(因为第一个字符是'd')...
- **功能**:显示文件内容或连接多个文件为单一输出。 - **用法**: - `cat file1`:显示文件`file1`的内容。 - `cat file1 file2 > file3`:将`file1`和`file2`的内容合并后输出到`file3`。 - **参数**: - `>`...