linux&Perl&R  

linux文件合并,去重复

第一:两个文件的交集,并集
前提条件:每个文件中不得有重复行
1. 取出两个文件的并集(重复的行只保留一份)
2. 取出两个文件的交集(只留下同时存在于两个文件中的文件)
3. 删除交集,留下其他的行
1. cat file1 file2 | sort | uniq > file3
2. cat file1 file2 | sort | uniq -d > file3
3. cat file1 file2 | sort | uniq -u > file3

第二:两个文件合并
一个文件在上,一个文件在下
cat file1 file2 > file3
一个文件在左,一个文件在右
paste file1 file2 > file3

第三:一个文件去掉重复的行:
sort file |uniq
注意:重复的多行记为一行,也就是说这些重复的行还在,只是全部省略为一行!
sort file |uniq -u
上面的命令可以把重复的行全部去掉,也就是文件中的非重复行!
具体细节可以查看,cat,sort,uniq等命令的详细介绍   重复行通常不会造成问题,但是有时候它们的确会引起问题。此时,不必花上一个下午的时间来为它们编制过滤器,uniq 命令便是唾手可得的好工具。了解一下它是如何节省您的时间和精力的。

进行排序之后,您会发现有些行是重复的。有时候该重复信息是不需要的,可以将它除去以节省磁盘空间。不必对文本行进行排序,但是您应当记住 uniq 在读取行时会对它们进行比较并将只除去两个或更多的连续行。下面的示例说明了它实际上是如何工作的:
清单 1. 用 uniq 除去重复行

              
       $ cat happybirthday.txt
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday Dear Tux!
Happy Birthday to You!
       $ sort happybirthday.txt
Happy Birthday Dear Tux!
Happy Birthday to You!
Happy Birthday to You!
Happy Birthday to You!
       $ sort happybirthday.txt | uniq
Happy Birthday Dear Tux!
Happy Birthday to You!
     


警告:请不要使用 uniq 或任何其它工具从包含财务或其它重要数据的文件中除去重复行。在这种情况下,重复行几乎总是表示同一金额的另一个交易,将它除去会给会计部造成许多困难。千万别这么干!
   
有关 uniq 的更多信息

本系列文章介绍了文本实用程序,它对在手册页和信息页找到的信息作了补充。如果您打开新的终端窗口并输入 man uniq 或 info uniq ,或者打开新的浏览器窗口并查看 位于 gnu.org 的 uniq 手册页,那么就可以了解更多的相关信息。

如果您希望您的工作轻松点,比如只显示唯一的或重复的行,那么该怎么办呢?
您可以用 -u (唯一)和 -d (重复)选项来做到这一点,例如:
清单 2. 使用 -u 和 -d 选项

               
       $ sort happybirthday.txt | uniq -u
Happy Birthday Dear Tux!
       $ sort happybirthday.txt | uniq -d
Happy Birthday to You!
     


您还可以用 -c 选项从 uniq 中获取一些统计信息:
清单 3. 使用 -c 选项

               
       $ sort happybirthday.txt | uniq -uc
      1 Happy Birthday Dear Tux!
       $ sort happybirthday.txt | uniq -dc
      3 Happy Birthday to You!
     


就算 uniq 对完整的行进行比较,它仍然会很有用,但是那并非该命令的全部功能。特别方便的是:使用 -f 选项,后面跟着要跳过的字段数,它能够跳过给定数目的字段。当您查看系统日志时这非常有用。通常,某些项要被复制许多次,这使得查看日志很难。使用简单的 uniq 无法完成任务,因为每一项都以不同的时间戳记开头。但是如果您告诉它跳过所有的时间字段,您的日志一下子就会变得更加便于管理。试一试 uniq -f 3 /var/log/messages ,亲眼看看。

还有另一个选项 -s ,它的功能就像 -f 一样,但是跳过给定数目的字符。您可以一起使用 -f 和 -s 。 uniq 先跳过字段,再跳过字符。如果您只想使用一些预先设置的字符进行比较,那么该怎么办呢?试试看 -w 选项。  补充:两文件按列合并: join -1 1 -2 1 a_sort.txt b_sort.txt
sort命令分析日志
很久没有更新blog了,上来冒个泡。 

    之前,常用cut,sort,uniq命令的组合分析程序的log,或者查看数据以便统计。例如:cut -d "|" -f 4 | sort | uniq -n -r。

    今天遇到一个问题,需要查看多个用户的操作记录。数据第一列可顺利的按照时间排序,然而用户名在中间,既然是log,那源数据便可能是多个用户的交叉记录了。比如:

 

以下是引用片段:
time0 | userA | action
time1 | userB | action
time2 | userC | action
time3 | userA | action
time4 | userC | action
time5 | userB | action
time6 | userC | action
time7 | userB | action

    很显然,我们希望的顺序是:

 

以下是引用片段:
time0 | userA | action
time3 | userA | action
time1 | userB | action
time5 | userB | action
time7 | userB | action
time2 | userC | action
time4 | userC | action
time6 | userC | action

    我们既想按照中间的数据的排序又要保持数据的完整性!也许可以用其他的命令实现这个,但我更倾向于使用常用的命令搞定复杂的事情。

    其实sort命令是可以实现这个的。sort的-t选项可以实现cut的-d功能,再利用+m -n参数可以实现cut的-f的功能,只是,sort的这个+m -n是从0开始计数的。+m -n是指从第m个字段开始,到第n个字段排序,其中包含第m个但不包含第n个。比如:sort -t "|" +1 -2 filename 就可以得到我们想要的结果了。-k 是单列排序,从1开始计算。

    sort的功能是排序,应用起来会有很多种排序的方式,可以用指定的参数来控制:

    - d 按字典顺序排序,比较时仅字母、数字、空格和制表符有意义。这个选项对 uniq -d 后的结果尤为有用。
    - f 将小写字母与大写字母同等对待。也就是忽略大小写。
    - I 忽略非打印字符。
    - M 作为月份比较:“JAN”<“FEB”
    - r 按逆序输出排序结果。这个可与 -d 同时使用,实现数字从大到小的排列

    -g是作为数字进行排列

    还有一个很实用的功能,如果你想把一个过滤后的文件内容重新写入到原文件,那么- o 参数可以达到这个要求,但是效率呢?嗯,是个问题,看取舍了!毕竟这种情况重定向是不行的。

    - o 输出文件 将排序输出写到输出文件中而不是标准输出,如果输出文件是输入文件之一,sort先将该文件的内容写入一个临时文件,然后再排序和写输出结果。

    很多系统实用小工具就是用这种常用名字组建的,嗯哼。

 

2012-10-16 评论-1

评论(1)

©linux&Perl&R Powered by LOFTER