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
#2
帖子
由 trigger » 2011-02-28 13:41
grep -f file1 file2
楼主真是一派胡言,真可谓:“两个黄鹂鸣翠柳,不知所云;一行白鹭上青天,不知所止“。本来不想和你辩论,今天气愤不过,和你理论一番。我国宪法写得清清楚楚:“一夜夫妻百日恩,七楼以上才有电梯”。这个想必你知道,既然知道,你就不能断章取义,就算是天气预报,它还有不准的时候呢!!!再者说了,那中国银行也不是你一家开的。人家马拉多纳都结婚了,你还拿着粮票顶什么用呢。真是滑天下之大稽。前些日子,全国人大刚刚开过会,郑重声明:“中国不搞多party制,存栏母猪给补贴”。多好的事呢,楞让你这号人给搅混了。
-
pangding
- 帖子: 48
- 注册时间: 2011-03-01 23:14
#3
帖子
由 pangding » 2011-03-02 10:48
代码: 全选
cat file1 file2 | sort | uniq -d
这样的代码行不行?
-
enthumelon
- 帖子: 86
- 注册时间: 2006-11-29 10:18
- 来自: USTC
-
联系:
#5
帖子
由 enthumelon » 2011-03-02 14:39
大谢了~2楼的可以用,三楼的我用R大约就是那么做的。不过数据是上十万行,sort的时候时间复杂度有点吓人啊。。。
-
sk1418
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
-
联系:
#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
-
联系:
#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
#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
-
联系:
#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
-
sk1418
- 帖子: 229
- 注册时间: 2007-07-01 17:36
- 系统: (En):System
- 来自: (En):address
-
联系:
#12
帖子
由 sk1418 » 2011-03-06 21:56
pangding 写了:用 fgrep 唄。 grep -F。
这个选项从来没用过。。。:(
学习了。
---
regards,
Kent
-
enthumelon
- 帖子: 86
- 注册时间: 2006-11-29 10:18
- 来自: USTC
-
联系:
#13
帖子
由 enthumelon » 2011-03-08 21:19
报告最终解决方案: 没有用grep,还是hash后查找的方式解决的。