LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1984|回复: 10

删除文件中重复的行

[复制链接]
发表于 2005-7-26 19:39:25 | 显示全部楼层 |阅读模式
cat -ns yourfile | sort -u -k 2 | sort -n -k 1 | cut -f 2- >yournewfile

cat : -n 输出行号
      -s 压缩多个空白行到一个空白行

sort: -u uniq 去掉重复行
      -k 2 按第二列排序(列之间用空格分隔?)
      -n 按数字序,否则按词典序

cut -f 2- 只要第二列到每行末尾

这个方法有一个bug,就是会把文件中所有的空行变成只有一个空行, 这个
bug是sort -u 导致的, 因为所有空行排到一起再uniq成一个空行了.

uname -a
Linux dieken 2.4.27-2-686 #1 Thu Jan 20 11:10:41 JST 2005 i686 GNU/Linux

cat --version
sort --version
cut --version

(coreutils) 5.2.1
Written by Mike Haertel and Paul Eggert.

Copyright (C) 2004 Free Software Foundation, Inc.
发表于 2005-7-26 22:29:52 | 显示全部楼层
what do you want to say?I cannt understand it!
回复 支持 反对

使用道具 举报

发表于 2005-7-26 22:38:29 | 显示全部楼层
And If you do want to achieve this function,you should just run:
cat file | sort | uniq -c | awk '$1 == 1{print $2}' > file.new;mv file.new file
Do you think so??
回复 支持 反对

使用道具 举报

发表于 2005-7-26 23:04:08 | 显示全部楼层
你这句话要空行也没有什么用处啊?难道是做什么标记?想了好久好象也想不出什么办法。。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-28 18:15:27 | 显示全部楼层
Post by Freebird
And If you do want to achieve this function,you should just run:
cat file | sort | uniq -c | awk '$1 == 1{print $2}' > file.new;mv file.new file
Do you think so??


郁闷了, 这么直白的标题居然.....

删除文件中重复的行,比如
----->begin
hello world
yes and no
hello world
no and yes
<------end
我想把第三行删除掉

awk我不懂,但是你cat file | sort | uniq 这样得到的输出已经失去了原有的*行序*,
后面的处理就没意义了。

行序:行的序号
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-7-28 18:18:24 | 显示全部楼层
cat -ns yourfile | sort -u -k 2 | sort -n -k 1 | cut -f 2-  >yournewfile

# 给文件编上行号以便以后利用这个行号恢复行序
cat : -n 输出行号
      -s 压缩多个空白行到一个空白行

# 第一次sort去掉重复的行,第二次sort恢复行序
sort: -u uniq 去掉重复行
      -k 2 按第二列排序(列之间用空格分隔?)
      -n 按数字序,否则按词典序

# 去掉第一步中添加的行号
cut -f 2- 只要第二列到每行末尾

这个方法有一个bug,就是会把文件中所有的空行变成只有一个空行, 这个
bug是sort -u 导致的, 因为所有空行排到一起再uniq成一个空行了.

uname -a
Linux dieken 2.4.27-2-686 #1 Thu Jan 20 11:10:41 JST 2005 i686 GNU/Linux

cat --version
sort --version
cut --version

(coreutils) 5.2.1
Written by Mike Haertel and Paul Eggert.

Copyright (C) 2004 Free Software Foundation, Inc.
回复 支持 反对

使用道具 举报

发表于 2005-11-6 15:19:05 | 显示全部楼层
搜索到这个帖子,省了我一段代码。:)
感谢dieken_qfz

uniq的-k选项可能会让人有些糊涂,上文并未详细解释。从help中看:
  -k, --key=POS1[,POS2]     start a key at POS1, end it at POS 2 (origin 1)
这是指执行排序时忽略POS1到POS2以外的列,否则cat -n加了行号,简单sort比较会每行都不一样的。
回复 支持 反对

使用道具 举报

发表于 2008-12-12 17:00:13 | 显示全部楼层
很好很强大, 收藏
回复 支持 反对

使用道具 举报

发表于 2008-12-12 18:25:47 | 显示全部楼层
awk "a[$0]++ == 0" file
linux下大概是单引号
回复 支持 反对

使用道具 举报

发表于 2008-12-16 19:05:14 | 显示全部楼层
Post by dieken_qfz;1221431

这个方法有一个bug,就是会把文件中所有的空行变成只有一个空行, 这个
bug是sort -u 导致的, 因为所有空行排到一起再uniq成一个空行了.


排完序还要空行做什么呢?如果有,那么它应该出现在排完序的文件中的哪一个位置呢?
排序的时候,行序已经完全打乱了,空行的位置似乎根本就无从决定:question:
回复 支持 反对

使用道具 举报

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

本版积分规则

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