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

How I can keep only the non repeated lines in a file?

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

..
a
b
b
c
d
d
..

所需的输出是:

..
a
c
..

非常感谢。

当您的文件排序后,很简单:

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

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

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

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

编辑: 保留原始顺序:

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

a
c

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

uniq 有参数 -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