LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: najia01

如何删除重复的行(sed或awk)

[复制链接]
发表于 2004-8-16 11:42:05 | 显示全部楼层
sort -k2n file|uniq
 楼主| 发表于 2004-8-16 11:44:54 | 显示全部楼层
看来,sed和awk也有局限性,grep sed awk的组合,只能满足大部分的文本处理
需求,却不能满足所有的文本处理的需求。
呵呵~~~~,又学了一课。
谢谢诸位!
:p
发表于 2004-8-16 12:28:28 | 显示全部楼层
对重复行的处理,uniq+sort是最佳组合
ps:unix/linux中的小工具,不可轻视
发表于 2004-8-16 13:57:31 | 显示全部楼层
最初由 najia01 发表
我猜大概是这样:
line应为一个变量。

if ($0!=line) print;line=$0;
可以这样理解:
因为awk也是一次读入一行,line第一次为空,所以自然就不等于$0($0为
"my friend,chenhong"),所以就打印了;接着把line的值赋为$0;然后awk又读
入一行,由于此时$0的值与line相同(均为"my friend,chenhong"),所以就不
打印了。当读入"my teacher, liyong"时,$0与line(值为
"my friend,chenhong")又不同了,所以打印出来。
其余的以此类推。

不知道这样理解,对不对?



不太明白的是,为什么你说line第一次为空呢?
发表于 2004-8-16 14:36:59 | 显示全部楼层
line 是 awk 的变量,象shell中的一样不需事先声明,没给它赋值前当然就是空的啊
 楼主| 发表于 2004-8-16 14:50:24 | 显示全部楼层
line第一次出现时,并未赋予任何初值,所以我猜它为空,只有执行了这条语句:line=$0;它才被赋予初值。
可能也不为空,但肯定不会等于$0。
 楼主| 发表于 2004-8-16 20:07:22 | 显示全部楼层
找到用一行命令解决的sed的解法:
sed "$!N;/^\(.*\)\n\1$/!P;D" file
具体什么意思,明天再讲,我得回去想想了。呵呵~~~~
:p
 楼主| 发表于 2004-8-17 14:58:10 | 显示全部楼层
想了想,大致是这样:
$!N;
是把下一行读入当前的pattern空间
/^\(.*\)\n\1$/!P
是不打印这样的行:"my friends,chenhong\nmy friends,chenhong",但是会
打印这样的行:"my friends,chenhong\nmy teacher, liyong"中的第一个'\n'
之前的行。
D,则是把第一个'\n'之前的行删除

各个部分可以这样理解,但是合到一块,我就发蒙了,哪位大侠解释下。
发表于 2007-11-19 11:29:28 | 显示全部楼层
无意中搜索到这个帖子,可以直接使用sort -u 进行过滤哦~
回复 支持 反对

使用道具 举报

发表于 2007-11-19 12:28:59 | 显示全部楼层
sort -u  需要排序

awk '!a[$0]++'
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表