为什么我的排序文件更大?

wb9*_*688 28 text-processing

我有一个 2958616 字节的文本文件。当我运行时 sort < file.txt | uniq > sorted-file.txt,我得到一个 3213965 字节的文本文件。为什么我排序的文本文件更大?

您可以在此处下载文本文件。

ter*_*don 42

虽然原始文件的行以 . 结尾\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
Run Code Online (Sandbox Code Playgroud)

如您所见,已排序的重复数据删除文件缩短了几行,因此也小了几个字节。但是,您的文件不同:

$ wc -l sorted-file.linux.txt sorted-file.txt 
271576 sorted-file.linux.txt
271576 sorted-file.txt
Run Code Online (Sandbox Code Playgroud)

这两个文件的行数完全相同,但是:

$ 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
Run Code Online (Sandbox Code Playgroud)

sorted-file.txt,我从你的链接下载一个,就是大。如果我们现在检查第一行,我们可以看到额外的\r

$ head -n1 sorted-file.txt | od -c
0000000   a  \r  \n
0000003
Run Code Online (Sandbox Code Playgroud)

我在 Linux 上创建的那个中没有:

$ head -n1 sorted-file.linux.txt | od -c
0000000   a  \n
0000002
Run Code Online (Sandbox Code Playgroud)

如果我们现在\r从您的文件中删除:

$ tr -d '\r' < sorted-file.txt > new-sorted-file.txt
Run Code Online (Sandbox Code Playgroud)

我们得到了预期的结果,一个比原始文件小的文件,就像我在我的系统上创建的文件一样:

$ 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
Run Code Online (Sandbox Code Playgroud)

  • sort 命令如何将 \r 添加到结果文件中?\r 和 \na 的组合不是 Windows 的东西吗? (3认同)
  • @TulainsCórdova 这是一个很好的问题。我不知道。我假设 OP 在非本地环境中执行此操作,但我不知道。是的,`\r\n` 行结尾是 Windows 的事情。 (3认同)

Byt*_*der 25

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   
Run Code Online (Sandbox Code Playgroud)

您的排序文件更大,因为它使用 Windows 行结尾\r\n(两个字节)而不是 Linux 行结尾\n(一个字节)。

难道您是在使用cygwinWindows 10 之类的工具或这个新的 Linux 子系统在 Windows下运行上面的命令吗?或者你是否在 Wine 中运行过一些东西?