分页: 1 / 1

保留两个文件相同的行

发表于 : 2011-02-28 9:14
enthumelon
谁能提供一个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


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

发表于 : 2011-02-28 13:41
trigger
grep -f file1 file2

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

发表于 : 2011-03-02 10:48
pangding

代码: 全选

cat file1 file2 | sort | uniq -d
这样的代码行不行?

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

发表于 : 2011-03-02 12:05
realfiona
学习了

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

发表于 : 2011-03-02 14:39
enthumelon
大谢了~2楼的可以用,三楼的我用R大约就是那么做的。不过数据是上十万行,sort的时候时间复杂度有点吓人啊。。。

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

发表于 : 2011-03-02 17:41
pangding
嗯。不过二楼的的确是好方法。

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

发表于 : 2011-03-04 7:22
sk1418
pangding 写了:

代码: 全选

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

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

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

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

发表于 : 2011-03-04 19:30
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

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

发表于 : 2011-03-05 9:40
trigger
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 仅匹配整行

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

发表于 : 2011-03-06 18:16
sk1418
忽略了-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选项忽略了,请指点。

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

发表于 : 2011-03-06 19:45
pangding
用 fgrep 唄。 grep -F。

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

发表于 : 2011-03-06 21:56
sk1418
pangding 写了:用 fgrep 唄。 grep -F。
这个选项从来没用过。。。:(
学习了。

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

发表于 : 2011-03-08 21:19
enthumelon
报告最终解决方案: 没有用grep,还是hash后查找的方式解决的。