ソートされたファイルが大きくなるのはなぜですか?


28

2958616バイトのテキストファイルがあります。を実行する sort < file.txt | uniq > sorted-file.txtと、3213965バイトのテキストファイルが取得されます。ソートされたテキストファイルが大きいのはなぜですか?

ここからテキストファイルをダウンロードできます。


5
出力ファイルには\r\n行末がありますが、入力ファイルには\n行末があります。おそらく、ロケールを異なるように設定する必要があります。LC_ALL=C各コマンドの前で試してください。
-meuh

2
@meuhそれはそれでした!それを答えとして追加してもらえますか?
wb9688

5
お待ちください、ロケールはこれに影響しますか?どのロケールを使用していますか?の出力はlocale何ですか?他のシステムでファイルを作成していませんか?
テルドン

6
sed '/^[a-z]*$/d' < file.txt | wc -l 私は305行を与えました。
-meuh

5
ファイルにâ ê î ñ ô ö öö ûは、ASCIIセットにないものも含まれています。
テルドン

回答:


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

2つのファイルの行数はまったく同じですが、次のとおりです。

$ 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のものではありませんか?
Tulainsコルドバ

3
@TulainsCórdovaそれは非​​常に良い質問です。何も思いつきません。私はOPが非ネイティブ環境でこれを行ったと仮定していますが、わかりません。そして、はい、\r\n行末はWindowsのものです。
テルドン

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   

ソートされたファイルは\r\n、Linuxの行末\n(1バイト)ではなくWindowsの行末(2バイト)を使用するため、より大きくなります。

cygwinWindows 10向けのこのような新しいLinuxサブシステムのいずれかを使用して、Windowsで上記のコマンドを実行していた可能性がありますか?それとも、おそらくWineで何かを実行しましたか?


Linux用のこの新しいWindowsサブシステム?bashは、その中で実行される1つのLinuxプログラムです。ソートはbashではありません。
user253751

@immibis Windows用のLinuxサブシステムですか?私はそれを意味していましたが、私自身はまだあまり興味を持っていなかったので、これまでそれを試みたり研究したりしませんでした。
バイトコマンダー

実際にはLinux用のWindowsサブシステムと呼ばれていますが、どちらも意味があります。(これが別のサブシステムでどのように見えるかを参照してください:「コンソール[アプリケーション]のWindowsサブシステム」または「Windowsのコンソール[アプリケーション]サブシステム」のいずれかが理にかなっています)
user253751

@immibisああ、わかりました。その特定のトピックにはまだあまり興味がなかったことがわかります。許してください:)
バイト司令官
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.