Làm thế nào để UNIX sắp xếp theo một cột duy nhất?


47

Tôi biết rằng tùy chọn -k cho sắp xếp Unix cho phép chúng tôi sắp xếp theo một cột cụ thể và tất cả những điều sau đây . Chẳng hạn, đưa ra tệp đầu vào:

2 3
2 2
1 2
2 1
1 1

Sử dụng sort -n -k 1, tôi nhận được một đầu ra được sắp xếp theo cột thứ 1 và sau đó theo cột thứ 2:

1 1
1 2
2 1
2 2
2 3

Tuy nhiên, tôi muốn giữ thứ tự cột thứ 2, như thế này:

1 2
1 1
2 3
2 2
2 1

Điều này có thể với sortlệnh?

Câu trả lời:


64

Hãy thử xem:

sort -s -n -k 1,1

Việc -ssắp xếp 'giải pháp cuối cùng' vô hiệu hóa, sắp xếp mọi thứ không phải là một phần của khóa được chỉ định.

Các -k 1không thực sự có nghĩa là "lĩnh vực này và tất cả những điều sau đây" trong bối cảnh loại số, như bạn có thể thấy nếu bạn cố gắng sắp xếp vào cột thứ hai. Bạn chỉ đơn thuần nhìn thấy mối quan hệ bị phá vỡ bằng cách đi đến phần còn lại của dòng. Nói chung, tuy nhiên, bạn cần phải xác định -k 1,1để sắp xếp chỉ trên một lĩnh vực.


Bạn đúng rồi. Đây chính xác là những gì tôi cần. Cảm ơn!

Có thể sử dụng tham gia vào đầu ra của loại này?
MiNdFrEaK

@MiNdFrEaK: Yêu cầu joinlà đầu vào phải được sắp xếp trên các trường bạn đang tham gia. Vì vậy, chắc chắn, đầu ra này được sắp xếp trên trường đầu tiên và bạn có thể tham gia vào nó.
Cascabel

Tôi có 2 tệp, một có 2 cột, một cột khác có 1 cột. Các tập tin thứ hai được sắp xếp bằng cách sử dụng sort -u. Bây giờ nhiệm vụ là tôi cần nối cột này với cột đầu tiên của tệp đầu tiên, không được sắp xếp, vậy cú pháp sẽ là gì? sẽ làm việc này? tham gia -j 1 file2.txt sort -s -n -k 1 file1.txt?
MiNdFrEaK

1
Phần -k 1,1(" , 1 ") không hoạt động tốt hơn đối với tôi. Những gì hoạt động là -s -k 1, với -nnếu bạn cần nó.
Toto

10

Để chỉ sắp xếp trên cột đầu tiên, bạn nên làm:

sort -n -s -k1,1

Từ Cẩm nang Quản trị Hệ thống Unix và Linux

sort chấp nhận thông số kỹ thuật chính -k3 (thay vì -k3,3), nhưng có lẽ nó không làm được những gì bạn mong đợi. Không có số trường kết thúc, khóa sắp xếp tiếp tục đến cuối dòng


Không làm việc cho tôi, tôi cần thêm -stùy chọn như Cascabel đã chỉ ra.
Jean Paul

@JeanPaul bạn đã đúng, tài liệu cho -sbiết "Tùy chọn này duy trì thứ tự bản ghi gốc của các bản ghi có khóa bằng nhau."
tidbeck

2

Không có câu trả lời nào được cung cấp thường làm việc cho tôi.

Cả hai sort -s -k 2 file1sort -n -k1,1thực hiện sắp xếp bổ sung với tập tin này:

# cat file1
 3 3 5
 3 2 3
 1 4 7
 0 1 2
 3 2 1

Tôi chỉ phải làm điều này chính xác và kết thúc bằng cách sử dụng một vòng lặp shell. Giải pháp này có thể không hoạt động tốt trên một tệp rất lớn vì toàn bộ tệp cần được đọc cho mỗi giá trị duy nhất trong cột được sắp xếp.

Ở đây tập tin chỉ được sắp xếp trên cột 2.

# awk '{print $2}' file1 | sort | uniq | while read index
do  
    awk -v var=$index '$2 == var { print $0}' file1 
done
 0 1 2
 3 2 3
 3 2 1
 3 3 5
 1 4 7

sort -s -k2,2 file1
plhn

Câu trả lời được đề xuất bởi Cascabel đang hoạt động nhưng tôi nghĩ bạn đã đọc nó.
Jean Paul
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.