第1页:第17章过滤器:比较和抽取
本页为第17章过滤器:比较和抽取的章节封面,标示本章讲解的cmp、comm、diff比较与cut、paste抽取组合。
第2页:本章需要解决的几个问题
- Unix中有10个用于比较文件、排序文件、从文件中抽取数据的重要程序,分别是什么?为什么有这么多?
- diff和sdiff有什么区别?
- 对于一个大的文本文件,使用哪些程序进行如下数据选取操作:a)重复行;b)唯一行;c)包含特定模式的行;d)以特定模式开头的行;e)数据列。
第3页:17.1文件数据操作汇总
- 10个比较、排序及抽取数据的程序:文件数量文件类型作用过滤器2二进制、文本比较两个文件cmp2有序文本比较两个有序文件,显示区别comn2文本比较两个文件,显示区别diff2文本比较两个文件,显示区别sdiff1..n文本从数据中抽取指定列cut
第4页:17.1文件数据操作汇总:10个比较
- 10个比较、排序及抽取数据的程序:文件数量文件类型作用过滤器1..n文本组合数据列paste1..n文本排序数据sort1有序文本选取重复/唯一列uniq1..n文本选取包含指定模式的行grep1有序文本选取以指定模式开头的行look
第5页:17.2比较任意两个文件:cmp
- 功能特征:按字节比较两个文件。例如:$ cmp data data-backupdata data-backup differ: byte 3, line 4
- 语法定义:cmpfile1 file2
第6页:17.3比较有序文本文件:comm
- 语法定义
- comm[-123]file1 file2
- 功能特征
- 按行比较两个有序文本文件。
第7页:17.3比较有序文本文件:comm
- 例子:两个文件frick和frackAlisonBarbaraBenChunkNoahAlisonBarbaraCandyChunkNoahSuefrickfrack
第8页:17.3比较有序文本文件:comm
- 例子:两个文件frick和frack$ comm frick frackAlisonBarbaraBenCandyChuckNoahSue分别使用-1-2-3选项,可以抑制1、2或3列的输出
第9页:17.4比较无序文本文件:diff
- 语法定义
- diff[-bBiqswy] [-c|-Clines|-u|-Ulines]file1 file2
- 功能特征
- 按行比较两个文本文件。
第10页:17.4比较无序文本文件:diff
- 例子1:两个文件old-names和new-names$ diff old-names new-names3c3< Paig---> PaigeGeneWillPaigMarkGeneWillPaigeMarkold-namesnew-names含义:左边文件的第3行修改为右边文件的第3行。单字符指示。可以有3个:c:changed:deletea:append指示文件方向
第11页:17.4比较无序文本文件:diff:2
- 例子2:两个文件old-names和new-names$ diff old-names new-names1a2> WillGenePaigeMarkGeneWillPaigeMarkold-namesnew-names含义:左边文件的第1行后面追加右边文件的第2行。
第12页:17.4比较无序文本文件:diff:3
- 例子3:两个文件old-names和new-names$ diff old-names new-names4d3< MarkGeneWillPaigeMarkGeneWillPaigeold-namesnew-names含义:删除左边文件的第4行。通常忽略d后面的数字
第13页:17.5 diff的选项
- -i
- 忽略大小写例如:bit和BIT是相同的
- -w
- 忽略所有的空白符例如:xx和x x是相同的
- -b
- 忽略空白符数量上的差别例如:x x和x x是相同的,但和xx不同
第14页:17.5 diff的选项:-B
- -q:当两个文件不同时,省略所有细节例如:$ diff-q frick frackFiles frick and frack differ
- -B:忽略所有的空白行
第15页:17.5 diff的选项:-s
- -s:当两个文件相同时,进行提示例如:假定文件f1和f2相同$ diff-s f1 f2Files f1 and f2 are identical
第16页:17.6比较文件时的输出格式
- 生成更易阅读的diff结果-1.使用-c选项例子:AlbaDeePat D.PhilAlbaDeeMickPat D.smartrich
第17页:$ diff:smart示例
$ diff命令示例:
-c smart rich***smart 2009-02-14 15:33:50.000000000-0700---rich 2009-02-14 15:34:04.000000000-0700****************** 1, 4 ****AlbaDeePat D.-Phil*** 1, 4 ****AlbaDee+MickPat D.
第18页:比较文件时的输出格式
- 生成更易阅读的diff结果-2.使用-u选项例子:AlbaDeePat D.PhilAlbaDeeMickPat D.smartrich
第19页:$ diff:usmart示例
$ diff命令示例:
-usmart rich***smart 2009-02-14 15:33:50.000000000-0700---rich 2009-02-14 15:34:04.000000000-0700@@-1, 4 +1,4@@AlbaDee+MickPat D.-Phil
第20页:比较文件时的输出格式
- 生成更易阅读的diff结果-3.使用-y选项例子:AlbaDeePat D.PhilAlbaDeeMickPat D.smartrich
第21页:$ diff:ysmart示例
$ diff命令示例:
-ysmart richAlbaAlbaDeeDee>MickPat D.Pat D.Phil<$ sdiff smart richAlbaAlbaDeeDee>MickPat D.Pat D.Phil<
第22页:比较文件时的输出格式:sdiff语法定义
- sdiff语法定义:sdiff[-bBilsW] [-wcolumn]file1 file2其中:-l:当两个文件有相同行时,只显示左边的列-s:不显示相同行-wcolumn:改变列的宽度-b:忽略空白符数量-B:忽略空白行-i:忽略大小写-W:忽略空白符
第23页:17.7差分和补丁
- 差分将一个文件转换成另一个文件的一串指示称为一个差分(diff)。
- 应用差分使用差分,以一个文件创建另外一个文件,称为应用了差分。用来应用差分的程序称为patch。
第24页:17.7差分和补丁:分发程序变化当程序员
- 分发程序变化当程序员使用差分来发布新版本时,通常将差分称为补丁(patch)。
第25页:17.8抽取数据列:cut
- 语法定义
- cut-clist[file…]其中:list:要抽取列的列表file:输入文件的名称
第26页:17.8抽取数据列:cut
- 例子:有文件student,内容如下2011532001<Tab>Mike <Tab>952011532002<Tab>Barton<Tab>642011532003<Tab>Canby <Tab>752011532004<Tab>Jordan<Tab>822011532005<Tab>Daniel<Tab>882011532006<Tab>Battie<Tab>89
第27页:17.8抽取数据列:cut示例
17.8抽取数据列:cut命令示例:
$cut-c 12-17 studentMikeBartonCandyJordanDanielBattie$cut-c 1-11 19-20 student201153200195201153200264201153200375201153200482201153200588201153200689
第28页:17.9抽取数据字段示意图
本页为课件示意图,配合图形说明17.9抽取数据字段小节的结构与流程。
第29页:17.9抽取数据字段示意图
本页为课件示意图,配合图形说明17.9抽取数据字段小节的结构与流程。
第30页:抽取数据字段:cut的另一个功能就
- cut的另一个功能就是可以从使用定界符分隔数据的文件中抽取数据字段。cut-flist[-ddelimiter] [-s][file…]其中:list:要抽取字段的列表delimiter:定界符file:目标文件
第31页:17.9抽取数据字段:cut示例
17.9抽取数据字段命令示例:
$cut-f 2-d ‘,’ studentMikeBartonCandyJordanDanielBattie$cut-f 1,3-d ‘,’ student201153200195201153200264201153200375201153200482201153200588201153200689
第32页:17.10组合数据列:paste
- 语法定义
- paste[-dchar][file…]其中:char:分隔符file:输入文件的名称
第33页:17.10组合数据列:paste
- 例子:有三个文件要求组合成一个CVS文件stu.cvs,包含ID、姓名、生日和电话字段ID001ZhangID002WangID003LiID004ZhaonameID0016601ID0026602ID0036603ID0046604phoneID00101/01/85ID00202/02/86ID00303/03/87ID00404/04/88birthday
第34页:17.10组合数据列:paste示例
17.10组合数据列:paste命令示例:
$paste-d ‘;’ name birthday phone > tmp.cvs$$cut-f 1,2,4,6-d ‘;’ > stu.cvs$$cat stu.cvsID001;Zhang;0001;01/01/85ID002;Wang;0002;02/02/86ID003;Li;0003;03/03/87ID004;Zhao;0004;04/04/88