保留两个文件相同的行

sh/bash/dash/ksh/zsh等Shell脚本
回复
enthumelon
帖子: 86
注册时间: 2006-11-29 10:18
来自: USTC
联系:

保留两个文件相同的行

#1

帖子 enthumelon » 2011-02-28 9:14

谁能提供一个sh脚本,作用是保留比较两个文件,保留他们相同的行(行无序)。以前用diff+sed/gawk搞过一个版本,估计是错的:

代码: 全选

#!/bin/sh
if [ $# != 5 ]
        then
                echo "using: h compare [File small] [File Large] [tmpfile] [tmpfile2] [Output]"
exit 1
fi
        diff -y --left-column $1 $2>$3
        sed '/^>/,+1!d' $3 >$5
        sed -e 's/^[[:space:]]*//g' $5>$4
        sed -e 's/.$//' $4>$3
        sed -e 's/^>[\t]//g' $3>$5
        rm $3
        rm $4
        #sed 's/[\t]//g' $4
#end

头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: 保留两个文件相同的行

#2

帖子 trigger » 2011-02-28 13:41

grep -f file1 file2
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
pangding
帖子: 48
注册时间: 2011-03-01 23:14

Re: 保留两个文件相同的行

#3

帖子 pangding » 2011-03-02 10:48

代码: 全选

cat file1 file2 | sort | uniq -d
这样的代码行不行?
头像
realfiona
帖子: 137
注册时间: 2007-11-20 10:58
来自: Hangzhou, China
联系:

Re: 保留两个文件相同的行

#4

帖子 realfiona » 2011-03-02 12:05

学习了
enthumelon
帖子: 86
注册时间: 2006-11-29 10:18
来自: USTC
联系:

Re: 保留两个文件相同的行

#5

帖子 enthumelon » 2011-03-02 14:39

大谢了~2楼的可以用,三楼的我用R大约就是那么做的。不过数据是上十万行,sort的时候时间复杂度有点吓人啊。。。
pangding
帖子: 48
注册时间: 2011-03-01 23:14

Re: 保留两个文件相同的行

#6

帖子 pangding » 2011-03-02 17:41

嗯。不过二楼的的确是好方法。
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 保留两个文件相同的行

#7

帖子 sk1418 » 2011-03-04 7:22

pangding 写了:

代码: 全选

cat file1 file2 | sort | uniq -d
这样的代码行不行?
这个应该不行。比如:
file1中不包含行aaaaa
但是file2里有2+行的aaaaa

最后你的结果里也含有aaaaa,是不对的。

如果文件很大, 可能awk也不会快。当然我只想了把一个小点的文件各行存到数组里,然后和另一个文件去对比。grep和awk哪个快不好说,lz去测试一下说说结果。
---
regards,

Kent
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 保留两个文件相同的行

#8

帖子 sk1418 » 2011-03-04 19:30

刚才又想了一下,2L的grep 方法也不是完全正确的。

比如:

代码: 全选

7PLaptop::/tmp
kent$ cat a.txt                                                                                                                                                                    [ 12:29 ]
2
3
4

7PLaptop::/tmp
kent$ cat b.txt                                                                                                                                                                    [ 12:29 ]
2bbbbb
3aaaaa
2
4

7PLaptop::/tmp
kent$ grep -f a.txt b.txt                                                                                                                                                          [ 12:29 ]
2bbbbb
3aaaaa
2
4


其实,正确的行只有2,4。

看来还只能用awk
---
regards,

Kent
头像
trigger
帖子: 1604
注册时间: 2006-10-25 18:08

Re: 保留两个文件相同的行

#9

帖子 trigger » 2011-03-05 9:40

sk1418 写了:刚才又想了一下,2L的grep 方法也不是完全正确的。

比如:

代码: 全选

7PLaptop::/tmp
kent$ cat a.txt                                                                                                                                                                    [ 12:29 ]
2
3
4

7PLaptop::/tmp
kent$ cat b.txt                                                                                                                                                                    [ 12:29 ]
2bbbbb
3aaaaa
2
4

7PLaptop::/tmp
kent$ grep -f a.txt b.txt                                                                                                                                                          [ 12:29 ]
2bbbbb
3aaaaa
2
4


其实,正确的行只有2,4。

看来还只能用awk
妄下结论

代码: 全选

grep -xf file1 file2
-x, --line-regexp 强制 PATTERN 仅匹配整行
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 保留两个文件相同的行

#10

帖子 sk1418 » 2011-03-06 18:16

忽略了-x这个选项。谢谢你提醒。

不过,有了这个也不是严谨的。因为文件内容随机,无法保证和regexp有混淆的。看下面例子:

代码: 全选

ArchT60::/tmp
kent$ echo "---a.txt---" ;cat a.txt;echo '---b.txt---';cat b.txt                                                               [ 11:11 ]
---a.txt---
aaa.
bbb
---b.txt---
aaal
bbb

应该只有bbb 是符合条件的行。但是结果:

ArchT60::/tmp
kent$ grep -x -f a.txt b.txt                                                                                                   [ 11:12 ]
aaal
bbb

所以我觉得如果按LZ要求,不排序还是awk能严谨一些。如果还有什么grep选项忽略了,请指点。
---
regards,

Kent
pangding
帖子: 48
注册时间: 2011-03-01 23:14

Re: 保留两个文件相同的行

#11

帖子 pangding » 2011-03-06 19:45

用 fgrep 唄。 grep -F。
sk1418
帖子: 229
注册时间: 2007-07-01 17:36
系统: (En):System
来自: (En):address
联系:

Re: 保留两个文件相同的行

#12

帖子 sk1418 » 2011-03-06 21:56

pangding 写了:用 fgrep 唄。 grep -F。
这个选项从来没用过。。。:(
学习了。
---
regards,

Kent
enthumelon
帖子: 86
注册时间: 2006-11-29 10:18
来自: USTC
联系:

Re: 保留两个文件相同的行

#13

帖子 enthumelon » 2011-03-08 21:19

报告最终解决方案: 没有用grep,还是hash后查找的方式解决的。
回复