我如何才能只保留文件中的非重复行?
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
我想做的就是像这样将不重复的行保留在一个大文件中:
..
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