정렬 된 파일이 더 큰 이유는 무엇입니까?


28

2958616 바이트 텍스트 파일이 있습니다. 을 실행 sort < file.txt | uniq > sorted-file.txt하면 3213965 바이트 텍스트 파일이 생성됩니다. 정렬 된 텍스트 파일이 더 큰 이유는 무엇입니까?

여기 에서 텍스트 파일을 다운로드 할 수 있습니다 .


5
출력 파일에는 \r\n줄 끝이 있고 입력 파일에는 \n줄 끝이 있습니다. 아마도 로케일을 다르게 설정해야합니다. LC_ALL=C각 명령 앞에서 시도하십시오 .
meuh

2
@meuh 그게 다야! 답변으로 추가해 주시겠습니까?
wb9688

5
잠깐, 로케일 이 이것에 영향을 줍니까? 어떤 로케일을 사용하고 있습니까? 출력은 locale무엇입니까? 다른 시스템에서 파일을 작성하지 않았습니까?
terdon

6
sed '/^[a-z]*$/d' < file.txt | wc -l 나에게 305 줄을 주었다.
meuh

5
파일 â ê î ñ ô ö öö û에 ASCII 세트에없는 파일도 포함되어 있습니다 .
terdon

답변:


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

리눅스에서 만든 것에는 없습니다 :

$ 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
Come sort 명령이 결과 파일에 \ r을 어떻게 추가 했습니까? \ r + \ na Windows의 조합이 아닌가?
Tulains Córdova

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   

정렬 된 파일은 \r\nLinux 줄 끝 \n(1 바이트) 대신 Windows 줄 끝 (2 바이트)을 사용하기 때문에 더 큽니다 .

cygwinWindows 10의 새로운 Linux 하위 시스템 과 같은 도구를 사용하여 Windows에서 해당 명령을 실행하고 있었 습니까? 아니면 와인에서 뭔가를 실행 했습니까?


이 새로운 Linux 용 Windows 서브 시스템 ? bash는 하나의 Linux 프로그램 일뿐입니다. sort는 bash가 아닙니다.
user253751

@immibis Windows 용 Linux 서브 시스템을 의미 합니까? 나는 그 자체로 아직 그다지 관심이 없었기 때문에 지금까지 더 이상 연구하거나 연구하지 않았습니다.
바이트 사령관

실제로 Linux 용 Windows Subsystem 이라고 하지만 둘 중 하나는 의미가 있습니다. (다른 서브 시스템에서 어떻게 보이는지보십시오 : "콘솔 [응용 프로그램] 용 Windows 서브 시스템"또는 "Windows 용 콘솔 [응용 프로그램] 서브 시스템"이 의미가 있음)
user253751

@immibis Aha, 알았어. 당신은 내가 그 특정 주제에 아직 관심이 없었습니다. 용서해주세요 :)
바이트 사령관
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.