打印独特的线条

打印独特的线条

sort除了和的组合之外,是否有更好的解决方案来打印独特的线条uniq

答案1

要以任意顺序仅打印每个相同的行:

sort -u

要以任意顺序仅打印唯一行:

sort | uniq -u

要按第一次出现的顺序将每个相同的行仅打印一次:(对于每行,如果尚未看到该行,则打印该行,然后在任何情况下增加已看到的计数器)

awk '!seen[$0] {print}
     {++seen[$0]}'

要仅按首次出现的顺序打印唯一的行:(将每一行记录在 中seenlines如果是第一次出现,则还记录在 中;在输入的末尾,按出现的顺序打印行,但只打印那些只看到的行一次)

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

相关内容