即使在 `sort` 之后,`uniq` 仍然重复一些值

Even after `sort`, `uniq` is still repeating some values

参考文件: http://snap.stanford.edu/data/wiki-Vote.txt.gz

(这是一个磁带存档,包含一个名为 Wiki-Vote.txt 的文件)

文件中的前几行包含以下内容,head -n 10 Wiki-Vote.txt

# Directed graph (each unordered pair of nodes is saved once): Wiki-Vote.txt 
# Wikipedia voting on promotion to administratorship (till January 2008). 
# Directed edge A->B means user A voted on B becoming Wikipedia administrator.
# Nodes: 7115 Edges: 103689
# FromNodeId    ToNodeId
     30          1412
     30          3352
     30          5254
     30          5543
     30          7478
     3            28

我想找到图中的节点数,(尽管它已经在第 3 行中给出)。我运行以下命令,

awk '!/^#/ { print ; print ; }' Wiki-Vote.txt | sort | uniq | wc -l

解释:

上述命令的结果是 8491,而不是 7115(如第 3 行所述)。我不知道为什么 uniq 会重复这些值。我可以说因为 awk '!/^#/ { print ; print ; }' Wiki-Vote.txt | sort -i | uniq | tail returns,

992
993
993
994
994
995
996
998
999
999

其中包含重复值。有人请 运行 代码并告诉我我不是唯一得到错误答案的人,请帮助我弄清楚为什么我得到我得到的结果。

文件有 dos 行结尾 - 每行以 \r CR 字符结尾。

您可以检查 tail 输出,例如 hexdump -C,以 # 开头的行由我添加:

$ awk '!/^#/ { print ; print ; }' ./wiki-Vote.txt | sort | uniq | tail | hexdump -C
00000000  39 39 32 0a 39 39 33 0a  39 39 33 0d 0a 39 39 34  |992.993.993..994|
#                                           ^^ HERE
00000010  0a 39 39 34 0d 0a 39 39  35 0d 0a 39 39 36 0a 39  |.994..995..996.9|
#                     ^^              ^^ 
00000020  39 38 0a 39 39 39 0a 39  39 39 0d 0a              |98.999.999..|
#                                        ^^
0000002c

因为 uniq 看到独特的行,一个有 CR,一个没有,所以它们没有被删除。在管道之前删除 CR 字符。请注意,sort | uniq 优于 sort -u

$ awk '!/^#/ { print ; print ; }' ./wiki-Vote.txt | tr -d '\r' | sort -u | wc -l
7115