当前位置: 首页>>技术问答>>正文


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

,

问题描述

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

您可以下载文本文件here

最佳解决思路

当您的原始文件包含以\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

如您所见,排序的de-duped文件缩短了几行,因此减少了几个字节。但是,您的文件不同:

$ 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

次佳解决思路

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子系统运行上面的命令?或者你可能在葡萄酒中运行一些东西?

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/6481.html,未经允许,请勿转载。