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
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
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).
Không có gì, họ sẽ tạo ra kết quả tương tự
sort -u
sẽ hơi nhanh hơn, bởi vì nó không cần phải ống đầu ra giữa hai lệnh
cũng thấy câu hỏi của tôi về chủ đề này: calling uniq and sort in different orders in shell
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.
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
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'. –
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.
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. –
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
[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