我有一个 2958616 字节的文本文件。当我运行 时 sort < file.txt | uniq > sorted-file.txt
,我得到一个 3213965 字节的文本文件。为什么我的排序后的文本文件更大?
您可以下载文本文件这里。
答案1
原始文件中的行以 结尾\n
,而排序后的文件的行以结尾\r\n
。 添加 是\r
改变大小的原因。
为了说明起见,以下是我在 Linux 系统上运行命令时发生的情况:
$ sort < file.txt | uniq > sorted-file.linux.txt
$ ls -l file.txt sorted-file.linux.txt
-rw-r--r-- 1 terdon terdon 2958616 Jul 10 12:11 file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:15 sorted-file.linux.txt
$ wc -l file.txt sorted-file.linux.txt
273882 file.txt
271576 sorted-file.linux.txt
如您所见,排序后的去重文件少了几行,因此也小了几个字节。但是,您的文件有所不同:
$ wc -l sorted-file.linux.txt sorted-file.txt
271576 sorted-file.linux.txt
271576 sorted-file.txt
这两个文件的行数完全相同,但是:
$ ls -l file.txt sorted-file.linux.txt sorted-file.txt
-rw-r--r-- 1 terdon terdon 2958616 Jul 10 12:11 file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:15 sorted-file.linux.txt
-rw-r--r-- 1 terdon terdon 3213965 Jul 10 12:11 sorted-file.txt
我从您的链接下载的那个sorted-file.txt
更大。如果我们现在检查第一行,我们可以看到额外的\r
:
$ head -n1 sorted-file.txt | od -c
0000000 a \r \n
0000003
我在 Linux 上创建的版本中不存在以下项:
$ head -n1 sorted-file.linux.txt | od -c
0000000 a \n
0000002
如果我们现在从您的文件中删除\r
:
$ tr -d '\r' < sorted-file.txt > new-sorted-file.txt
我们得到了预期的结果,一个比原始文件更小的文件,就像我在系统上创建的文件一样:
$ ls -l sorted-file.linux.txt new-sorted-file.txt file.txt
-rw-r--r-- 1 terdon terdon 2958616 Jul 10 12:11 file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:19 new-sorted-file.txt
-rw-r--r-- 1 terdon terdon 2942389 Jul 10 15:15 sorted-file.linux.txt
答案2
hexdump
揭示它!
$ hexdump -cn 32 file.txt
0000000 a d h d \n a d s l \n a m v b \n a
0000010 o v \n a o w \n a r o b \n a s f a
0000020
$ hexdump -cn 32 my-sorted.txt
0000000 a \n a a \n a a a \n a a d \n a a d
0000010 s \n a a f j e \n a a f j e s \n a
0000020
$ hexdump -cn 32 sorted-file.txt
0000000 a \r \n a a \r \n a a a \r \n a a d \r
0000010 \n a a d s \r \n a a f j e \r \n a a
0000020
排序后的文件更大,因为它使用 Windows 行尾\r\n
(两个字节)而不是 Linux 行尾\n
(一个字节)。
您是否在 Windows 下使用类似工具cygwin
或适用于 Windows 10 的新 Linux 子系统运行上述命令?或者您可能在 Wine 中运行了某些命令?