即使在 `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
解释:
/^#/
匹配所有以 #
开头的行。 !/^#/
匹配不匹配。
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
参考文件: 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
解释:
/^#/
匹配所有以#
开头的行。!/^#/
匹配不匹配。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