Chinaunix

标题: 如何统计两个文件的不同? [打印本页]

作者: jopener    时间: 2008-05-20 11:31
标题: 如何统计两个文件的不同?
两个文件fileA,fileB,存了一堆名字,格式如下:
jack wong
张三
李四


需要计算只包含在某个文件的名字数量。如统计只在B中的名字数量,我的代码如下


  1. #排序
  2. sort fileA > fileA.sort
  3. sort fileB > fileB.sort

  4. #计算A和B的数量
  5. awk 'if(!u[$0]){u[$0]+=1;uniqUser+=1} END{print uniqUser, FNR}' fileA.sort
  6. awk 'if(!u[$0]){u[$0]+=1;uniqUser+=1} END{print uniqUser, FNR}' fileB.sort

  7. #计算只在B中的数量
  8. comm -13 fileA.sort fileB.sort > uniq.sort
  9. awk 'if(!u[$0]){u[$0]+=1;uniqUser+=1} END{print uniqUser, FNR}' uniq.sort

  10. #删除临时文件
  11. rm -f fileA.sort
  12. rm -f fileB.sort
  13. rm -f uniq.sort
复制代码


(1)觉得写得太复杂了,有简单的方法吗?
(2)名字前后可能包含空格,awk如何做trim操作呢?
(3)文件比较大,每个里面都有几百万记录,效率太低了。。。

请大家指点一下。我学习学习
作者: dolphinlater    时间: 2008-05-20 21:21
标题: 回复 #1 jopener 的帖子
稍微简单一点:
sort -u fileA > fileA.sort  #排序并合并相同行(合并是关键)
sort -u fileB > fileB.sort

diff fileA.sort fileB.sort | awk '/</{onlyA++}/>/{onlyB++}END{print "only in A:",onlyA "\nonly in B:",onlyB}'

另请问下高手:用awk遍历一个大文件(出现过的名字打印一次)和sort -u哪个快些?(sort还做了排序,工作多些)
作者: jinl    时间: 2008-05-20 21:29

  1. awk 'NR==FNR {a[$0]++};NR>FNR&&!a[$0] {b[$0]++};END {for (i in b) {print i}' a.file b.file
复制代码

作者: youyu_buzai    时间: 2008-05-20 22:49
用MD5算2个文件的值
作者: 寂寞烈火    时间: 2008-05-21 01:05
标题: 回复 #4 youyu_buzai 的帖子
大文件的话忒慢了吧
PS: 还是举个实例好些

[ 本帖最后由 寂寞烈火 于 2008-5-21 01:06 编辑 ]




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2