我如何只保留文件中的非重复行?

时间:2015-09-24 08:53:48

标签: bash shell sed uniq

我想要做的就是在这样一个巨大的文件中保留不重复的行:

..
a
b
b
c
d
d
..

然后是所需的输出:

..
a
c
..

非常感谢提前。

3 个答案:

答案 0 :(得分:5)

uniq已arg -u

  -u, --unique          only print unique lines

示例:

$ printf 'a\nb\nb\nc\nd\nd\n' | uniq -u
a
c

如果您的数据未排序,请先执行sort

$ printf 'd\na\nb\nb\nc\nd\n' | sort | uniq -u

保留订单:

$ cat foo
d
c
b
b
a
d

$ grep -f <(sort foo | uniq -u) foo
c
a

greps上述uniq获取的模式文件。但我可以想象,如果你的文件非常庞大,那么它需要很长时间。

同样没有一些丑陋的流程替换

$ sort foo | uniq -u | grep -f- foo
c
a

答案 1 :(得分:2)

这个awk应该只列出文件中没有重复的行:

awk 'seen[$0]++{dup[$0]} END {for (i in seen) if (!(i in dup)) print i}' file
a
c

请记住,由于awk中数组的散列,原始的行顺序可能会发生变化。

编辑:保留原始订单:

awk '$0 in seen{dup[$0]; next}
     {seen[$0]++; a[++n]=$0}
     END {for (i=1; i<=n; i++) if (!(a[i] in dup)) print a[i]}' file

a
c

这是为awk量身定制的工作,它不需要多个进程,管道和进程替换,对于更大的文件会更有效。

答案 2 :(得分:-2)

当您的文件被排序时,它很简单:

cat file.txt | uniq > file2.txt
mv file2.txt file.txt