分页: 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后查找的方式解决的。