Sắp xếp dựa trên cột thứ ba


132

Tôi đang đối mặt với một tệp 4 cột lớn. Tôi muốn hiển thị tệp được sắp xếp trong thiết bị xuất chuẩn dựa trên cột thứ 3 của nó:

cat myFile | sort -u -k3

Như vậy đã đủ để thực hiện mánh khóe chưa?


4
Lưu ý rằng bạn có thể viết này như sort -u -k3 < myFile.
gerrit

6
Như sort -u -k3 myFile, thậm chí
Sebastian Graf

Câu trả lời:


168
sort -k 3,3 myFile

sẽ hiển thị tệp được sắp xếp theo cột thứ 3 với giả sử các cột được phân tách bằng các chuỗi khoảng trống (ký tự ASCII SPC và TAB trong miền địa phương POSIX / C), theo thứ tự sắp xếp được xác định bởi miền địa phương hiện tại.

Lưu ý rằng các khoảng trống hàng đầu được bao gồm trong cột (dấu phân cách mặc định là sự chuyển đổi từ không trống sang trống), có thể tạo ra sự khác biệt trong các địa điểm nơi không gian không bị bỏ qua cho mục đích so sánh, sử dụng -btùy chọn để bỏ qua khoảng trống hàng đầu.

Lưu ý rằng nó hoàn toàn độc lập với shell (tất cả các shell sẽ phân tích dòng lệnh đó giống nhau, các shell thường không có sortlệnh được tích hợp).

-k 3là sắp xếp trên một phần của các dòng bắt đầu bằng cột thứ 3 (bao gồm cả các khoảng trống hàng đầu). Trong ngôn ngữ C, vì các ký tự khoảng trắng và tab xếp trước tất cả các ký tự có thể in, nên thường sẽ cho bạn kết quả giống như -k 3,3(ngoại trừ các dòng có trường thứ ba giống hệt nhau),

-ulà chỉ giữ lại một trong các dòng nếu có một vài dòng sắp xếp giống hệt nhau (đó là nơi khóa sắp xếp giống nhau (điều đó không nhất thiết giống như bằng )).

catlà lệnh để con mèo ghen tị. Bạn không cần nó ở đây.

Nếu các cột được phân tách bằng thứ khác, bạn cần -ttùy chọn để chỉ định dấu phân cách.

Cho ví dụ tập tin a

$ cat a
a c c c
a b ca d
a b  c e
a b c d

Với -u -k 3:

$ echo $LANG
en_GB.UTF-8

$ sort -u -k 3 a
a b ca d
a c c c
a b c d
a b  c e

Dòng 2 và 3 có cùng cột thứ ba, nhưng ở đây khóa sắp xếp là từ cột thứ ba đến cuối dòng, vì vậy -ugiữ lại cả hai. ␠ca␠dsắp xếp trước ␠c␠cvì không gian bị bỏ qua trong lần đầu tiên ở địa phương của tôi, cadsắp xếp trước cc.

$ sort -u -k 3,3 a
a b c d
a b  c e
a b ca d

Trên chỉ có một được giữ lại cho những người có cột thứ 3 ␠c. Lưu ý cách giữ lại một ␠␠c(2 khoảng trắng hàng đầu).

$ sort -k 3 a
a b ca d
a c c c
a b c d
a b  c e
$ sort -k 3,3 a
a b c d
a c c c
a b  c e
a b ca d

Xem cách thứ tự a b c da c c cđược đảo ngược. Trong trường hợp đầu tiên, vì ␠c␠csắp xếp trước ␠c␠d, trong trường hợp thứ hai vì khóa sắp xếp giống nhau ( ␠c), so sánh cuối cùng so sánh các dòng trong các lần đặt đầy đủ a b c dtrước đó a c c c.

$ sort -b -k 3,3 a
a b c d
a b  c e
a c c c
a b ca d

Khi chúng ta bỏ qua các khoảng trống, khóa sắp xếp cho 3 dòng đầu tiên là giống nhau ( c), do đó chúng được sắp xếp theo so sánh cuối cùng.

$ LC_ALL=C sort -k 3 a
a b  c e
a c c c
a b c d
a b ca d
$ LC_ALL=C sort -k 3,3 a
a b  c e
a b c d
a c c c
a b ca d

Trong miền địa phương C, ␠␠csắp xếp trước ␠cvì chỉ có một đường chuyền có các ký tự (sau đó là byte đơn) sắp xếp dựa trên giá trị điểm mã của chúng (trong đó không gian có điểm mã thấp hơn c).


các cột được phân blanktách có thể bao gồm các ký tự khác ngoài khoảng trắng và tab tùy thuộc vào miền địa phương.
jfs

1
Đẹp, +1. Bạn có thể giải thích những gì 3,3không? Tại sao không chỉ 3?
terdon

@terdon, xem mô tả mở rộng với các ví dụ.
Stéphane Chazelas

@JFSebastian, bạn nói đúng, cập nhật câu trả lời.
Stéphane Chazelas

Ah, để làm cho nó chỉ sắp xếp vào thứ 3, không phải phần còn lại của dòng, cảm ơn.
terdon

4

Nếu bạn hiểu "cột" như trong tệp văn bản (ký tự thứ 4) thì có, giải pháp của bạn sẽ hoạt động (hoặc thậm chí sort -u -k3 myFilecho phép sortthực hiện một số phép thuật tiết kiệm bộ nhớ với quyền truy cập ngẫu nhiên). Nếu bạn hiểu "cột" như trong cơ sở dữ liệu - toàn bộ thực thể dữ liệu được theo sau bởi dấu phân cách và chiều rộng cột thay đổi, bạn sẽ cần một cái gì đó fancier, ví dụ như loại này ls -l theo kích thước

      ls -l |awk '{print $5 " " $0;}'| sort -n | cut -d " " -f 2-

(tương đương với tầm thường ls -lSnhưng phục vụ ví dụ độc đáo.)


5
Không, theo mặc định, các cột sắp xếp được phân tách trống, chúng không phải là các cột ký tự, để sắp xếp trên cột ký tự thứ 3, cú pháp sẽ là : sort -k 1.3,1.3. ls -l | sort -k5,5nđể sắp xếp theo kích thước.
Stéphane Chazelas

Các awkgiải pháp chính xác là những gì tôi needed-- dễ dàng sửa đổi để phù hợp với yêu cầu phân loại phức tạp
jchook

2
sort -g -k column_number 

là lệnh đúng để sắp xếp bất kỳ danh sách nào có các ký tự số sử dụng cột cụ thể


1
Sử dụng -k đã được bảo vệ khá tốt vì vậy sẽ rất hữu ích nếu bạn giải thích cách lệnh này khác hoặc tốt hơn. Có lẽ bạn cũng có thể bao gồm số cột thực tế để giải quyết câu hỏi thực tế của OP.
Jeff Schaller

Điều này khiến tôi sử dụng các trang man: p "-g, --general-number-sort, so sánh theo giá trị số chung", đó là những gì tôi cần trong trường hợp của mình.
tham gia


0
$ sort -k 1.3,1.3 myfile

Sẽ sắp xếp tệp myfile của bạn trên cột thứ ba nếu tệp của bạn không có dấu phân cách.

$ cat myfile 
ax5aa 
aa3ya 
fg7ds 
pp0dd 
aa1bb

$ sort -k 1.3,1.3 myfile 
pp0dd 
aa1bb
aa3ya 
ax5aa 
fg7ds 

trang người đàn ông sắp xếp:

[...] -k, --key = POS1 [, POS2] bắt đầu khóa tại POS1 (nguồn gốc 1), kết thúc tại POS2 (cuối dòng mặc định) [...] POS là F [.C] [ OPTS], trong đó F là số trường và C vị trí ký tự trong trường; cả hai đều là gốc 1. Nếu cả -t và -b không có hiệu lực, các ký tự trong trường được tính từ đầu khoảng trắng trước. OPTS là một hoặc nhiều tùy chọn đặt hàng một chữ cái, ghi đè các tùy chọn đặt hàng toàn cầu cho khóa đó. Nếu không có khóa nào được đưa ra, hãy sử dụng toàn bộ dòng làm khóa.

Với --key = 1.3,1.3, bạn đã nói rằng chỉ có một trường (toàn bộ dòng) và bạn đang so sánh vị trí ký tự thứ ba của trường này.

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.