为什么我的分类文件更大?


28

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

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


5
您的输出文件具有\r\n行尾,而输入文件具有\n行尾。也许您应该设置不同的语言环境。LC_ALL=C在每个命令前尝试。
meuh '16

2
@meuh就是这样!您能补充一下吗?
wb9688 '16

5
等等,这会影响到语言环境吗?您使用什么语言环境?输出是locale什么?您确定没有在其他系统上创建文件吗?
terdon

6
sed '/^[a-z]*$/d' < file.txt | wc -l 给了我305行。
meuh '16

5
您的文件还包含â ê î ñ ô ö öö û不在ASCII集中的那些文件。

Answers:


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

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

$ 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

3
排序命令如何将\ r添加到生成的文件中?\ r加\ na Windows组合不是吗?
图兰斯·科尔多瓦

3
@TulainsCórdova这是一个很好的问题。我不知道。我假设OP在非本地环境中执行此操作,但我不知道。是的,\r\n行尾是Windows的东西。
terdon

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   

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

可能是您在Windows上使用任何一种工具(例如, cygwin Windows 10的新或?还是您可能在Wine中经营过一些?


这个用于Linux的Windows子系统?bash只是其中运行的一个Linux程序;排序不是bash。
user253751'7

@immibis您的意思是Windows的Linux子系统?我的意思是,但我自己对此还不太感兴趣,因此到目前为止,尚未尝试或进一步研究它。
字节指挥官

它实际上被称为LinuxWindows子系统,但是任何一个都有意义。(请参阅另一个子系统的外观:“用于控制台[应用程序]的Windows子系统”或“用于Windows的控制台[应用程序]子系统”是有意义的)
user253751 '16

@immibis Aha,好的。您看到我对那个特定主题还不太感兴趣。请原谅我:)
Byte Commander
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.