如何在Unix系统中删除文件中的重复行?

3

我可以使用以下命令删除文件中的重复行: 1)sort -u 和 uniq 命令。用 sed 或 awk 可以实现吗?


2
如果你已经有了sort和uniq,为什么还要使用sed或awk呢? - Skriptotajs
可能是可以的,因为据我所记,它们都是图灵完备语言。问题在于你会用它们来做什么,正如@Skriptotajs所指出的那样。 - Rubens
可能是重复的问题:如何在Unix中删除文件中的重复行? - tripleee
3个回答

11

有个“著名”的awk习惯用法:

awk '!seen[$0]++' file

它必须将唯一行保留在内存中,但保留文件顺序。


这看起来很棒,但在我的macOS Sierra上不知道为什么无法工作。 - mherzl
仅适用于小文件,如果文件大于内存+交换空间,则无法工作。 - Alex Muravyov
对于“小”的某种定义。以GB为单位衡量。 - glenn jackman

0

排序后,我们可以使用以下sed命令

sed -E '$!N; /^(.*)\n\1$/!P; D' filename

如果文件未排序,则可以使用命令的组合。
sort filename | sed -E '$!N; /^\(.*\)\n\1$/!P; D' 

很明显,如果无法对文件进行排序,则这些替代方案是不可接受的。 - tripleee

0

排序和去重只需要删除重复项 cat 文件名 | sort | uniq >> 文件名2

如果文件包含数字,请使用 sort -n


尽管cat是无用的。 - tripleee
uniq 命令也是无用的。只需使用 sort -u 文件名 命令即可。 -u 选项会调用 sort 的唯一模式。[这些都没有回答 OP 的问题...] - dave58

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接