2010-08-01 46 views
36

Sự khác nhau giữa các lệnh sau đây là gì?Sắp xếp & bỏ chọn trong vỏ Linux

sort -u FILE 

sort FILE | uniq 
+0

Khi bạn chạy chúng, bạn đã thấy gì? Bạn đã thử thu thập sự khác biệt thời gian cho các tệp có kích thước khác nhau? Bạn có thể chạy một vài thử nghiệm và đăng kết quả là một phần của câu hỏi của bạn. –

+0

Tôi muốn biết nếu có một trường hợp đặc biệt là cả hai lệnh hoạt động khác nhau, trong một thực hiện bình thường cả hai đều cho kết quả tương tự – yassin

+3

[Sự khác biệt giữa "sắp xếp -u" và "sắp xếp | uniq ”?] (http://unix.stackexchange.com/q/76049/17265) – mtk

Trả lời

59

Sử dụng sort -u có ít I/O hơn sort | uniq, nhưng kết quả cuối cùng cũng giống nhau. Đặc biệt, nếu tệp đủ lớn để sort tạo các tệp trung gian, có khả năng là sort -u sẽ sử dụng các tệp trung gian hơi nhỏ hơn hoặc nhỏ hơn một chút vì nó có thể loại bỏ các bản sao vì nó sắp xếp từng bộ. Nếu dữ liệu có tính trùng lặp cao, điều này có thể mang lại lợi ích; nếu có vài bản sao trong thực tế, nó sẽ không tạo ra nhiều khác biệt (chắc chắn là một hiệu ứng thứ tự hiệu suất thứ hai, so với hiệu ứng thứ tự đầu tiên của đường ống).

Lưu ý rằng đôi khi đường ống thích hợp. Ví dụ:

sort FILE | uniq -c | sort -n 

Điều này sắp xếp thứ tự số lần xuất hiện của mỗi dòng trong tệp, với các dòng lặp lại xuất hiện cuối cùng. (Nó sẽ không làm tôi ngạc nhiên khi thấy rằng sự kết hợp này, là thành ngữ cho Unix hoặc POSIX, có thể được xếp thành một lệnh 'sắp xếp' phức tạp với kiểu sắp xếp GNU.)

Có những lúc không sử dụng ống là quan trọng . Ví dụ:

sort -u -o FILE FILE 

Điều này sắp xếp tệp 'tại chỗ'; nghĩa là, tệp đầu ra được chỉ định bởi -o FILE và thao tác này được đảm bảo an toàn (tệp được đọc trước khi được ghi đè cho đầu ra).

+0

Cảm ơn câu trả lời hoàn chỉnh! – yassin

+0

gnu sắp xếp không có cách nào để làm tất cả 'sắp xếp | uniq -c | sắp xếp -n', và tôi không tìm thấy bất kỳ công cụ nào khác để làm điều đó một cách hiệu quả. Có vẻ như một thứ đáng giá để mã hóa. – mc0e

2

Không có gì, họ sẽ tạo ra kết quả tương tự

10

Có một khác biệt nhỏ: mã trả lại.

Vấn đề là trừ khi shopt -o pipefail được đặt mã trả về của lệnh đường ống sẽ là mã trả về của lệnh cuối cùng. Và uniq luôn trả về số không (thành công). Hãy thử kiểm tra mã thoát và bạn sẽ thấy một cái gì đó như thế này (pipefail không được đặt ở đây):

[email protected] ~ $ sort -u file_that_doesnt_exist ; echo $? 
sort: open failed: file_that_doesnt_exist: No such file or directory 
2 
[email protected] ~ $ sort file_that_doesnt_exist | uniq ; echo $? 
sort: open failed: file_that_doesnt_exist: No such file or directory 
0 

Khác với lệnh này, các lệnh tương đương.

0

Tôi đã làm việc trên một số máy chủ trong đó sắp xếp không hỗ trợ tùy chọn '-u'. ở đó chúng tôi phải sử dụng

sort xyz | uniq 
+1

Bạn có muốn chỉ định máy chủ nào có phiên bản o/s nào và khi nào? Bản UNIX ™ 'sort' thứ 7 được hỗ trợ' -u' và đó là phiên bản được sử dụng rộng rãi của UNIX, vì vậy tất cả những người khác (Hệ thống III, Hệ thống V, BSD, vv) có xu hướng theo dõi nó, vì vậy tôi sẽ ngạc nhiên để tìm một hệ thống giống Unix, trong đó 'sort' không hỗ trợ' -u'. –

6

Cẩn thận! Mặc dù đúng là "sắp xếp -u" và "sắp xếp | uniq" là tương đương, bất kỳ tùy chọn bổ sung nào để sắp xếp có thể phá vỡ sự tương đương. Dưới đây là ví dụ từ hướng dẫn sử dụng lõi:

Ví dụ: 'sort -n -u' chỉ kiểm tra giá trị của chuỗi số ban đầu khi kiểm tra tính duy nhất, trong khi 'sắp xếp -n | uniq 'kiểm tra toàn bộ dòng.

Tương tự, nếu bạn sắp xếp trên các trường khóa, kiểm tra tính duy nhất được sử dụng theo sắp xếp sẽ không nhất thiết phải xem toàn bộ dòng nữa.Sau khi bị cắn bởi lỗi đó trong quá khứ, những ngày này tôi có xu hướng sử dụng "sort | uniq" khi viết kịch bản Bash. Tôi muốn có phí I/O cao hơn so với chạy rủi ro mà một người nào khác trong cửa hàng sẽ không biết về lỗ hổng cụ thể đó khi họ sửa đổi mã của tôi để thêm các thông số sắp xếp bổ sung.

Các vấn đề liên quan