sort
除了和的组合之外,是否有更好的解决方案来打印独特的线条uniq
?
答案1
要以任意顺序仅打印每个相同的行:
sort -u
要以任意顺序仅打印唯一行:
sort | uniq -u
要按第一次出现的顺序将每个相同的行仅打印一次:(对于每行,如果尚未看到该行,则打印该行,然后在任何情况下增加已看到的计数器)
awk '!seen[$0] {print}
{++seen[$0]}'
要仅按首次出现的顺序打印唯一的行:(将每一行记录在 中seen
,lines
如果是第一次出现,则还记录在 中;在输入的末尾,按出现的顺序打印行,但只打印那些只看到的行一次)
awk '!seen[$0]++ {lines[i++]=$0}
END {for (i in lines) if (seen[lines[i]]==1) print lines[i]}'
答案2
某些(大多数?)版本sort
有一个直接-u
执行该uniq
部分的标志。不过,根据实现的不同,可能会有一些行长度限制,但您已经有了 plain 的限制sort|uniq
。
答案3
对于答案中提到的最后一部分:打印独特的线条@Gilles 作为这个问题的答案,我试图消除使用两个哈希值的需要。
此解决方案适用于:仅按第一次出现的顺序打印唯一的行:
awk '{counter[$0]++} END {for (line in counter) if (counter[line]==1) print line}'
这里,“计数器”存储与之前处理的行类似的每一行的计数。
最后,我们只打印那些计数器值为 1 的行。
答案4
Perl 适合你吗?即使重复项不相邻,它也可以保持行的原始顺序。您还可以使用 Python 或awk
.
while (<>) {
print if $lines{$_}++ == 0;
}
可以缩短为
perl -ne 'print unless $lines{$_}++;'
给定输入文件:
abc
def
abc
ghi
abc
def
abc
ghi
jkl
它产生输出:
abc
def
ghi
jkl