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?
sort -u -k3 myFile
, thậm chí
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?
sort -u -k3 myFile
, thậm chí
Câu trả lời:
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 -b
tù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ó sort
lệnh được tích hợp).
-k 3
là 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),
-u
là 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 )).
cat
là 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 -t
tù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 -u
giữ lại cả hai. ␠ca␠d
sắp xếp trước ␠c␠c
vì không gian bị bỏ qua trong lần đầu tiên ở địa phương của tôi, cad
sắ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 d
và a c c c
được đảo ngược. Trong trường hợp đầu tiên, vì ␠c␠c
sắ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 d
trướ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, ␠␠c
sắp xếp trước ␠c
vì 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
).
blank
tá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.
3,3
không? Tại sao không chỉ 3
?
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 myFile
cho phép sort
thự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 -lS
nhưng phục vụ ví dụ độc đáo.)
sort -k 1.3,1.3
. ls -l | sort -k5,5n
để sắp xếp theo kích thước.
awk
giả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
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ể
$ 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.
sort -u -k3 < myFile
.