Sắp xếp dữ liệu dựa trên cột thứ hai của tệp


212

Tôi có một tập tin gồm hai cột và nsố hàng.

cột 1 chứa namesvà cột2 age.

Tôi muốn sắp xếp nội dung của tệp này theo thứ tự tăng dần dựa trên age(trong cột thứ hai).

Kết quả sẽ hiển thị namengười trẻ nhất cùng với namengười trẻ thứ hai và sau đó ...

Bất kỳ đề xuất cho một lớp vỏ hoặc tập lệnh bash.


1
Superset: dấu phân cách tùy chỉnh: stackoverflow.com/questions/1037365/iêu
Ciro Santilli 冠状 病 六四

Câu trả lời:


329

Bạn có thể sử dụng sortlệnh :

sort -k2 -n yourfile

-n, --numeric-sortso sánh theo chuỗi giá trị số

Ví dụ:

$ cat ages.txt 
Bob 12
Jane 48
Mark 3
Tashi 54

$ sort -k2 -n ages.txt 
Mark 3
Bob 12
Jane 48
Tashi 54

1
cũng lưu ý rằng việc sử dụng -hthay vì -ngiá trị có thể đọc được loại người như thế sẽ 2Ghay 3Kcũng như số cách nhau bằng dấu phẩy ví dụ1,234.5
chillitom

Vấn đề phải đối mặt với đặt hàng "sai". Hãy chú ý đến con người "*** CẢNH BÁO *** Vị trí được chỉ định bởi môi trường ảnh hưởng đến thứ tự sắp xếp. Đặt LC_ALL=Cđể có được thứ tự sắp xếp truyền thống sử dụng các giá trị byte gốc." (đối với trường hợp khớp chuỗi không có -n)
x'ES

Điều này không xem xét các khoảng trắng trong cột đầu tiên cũng không hoạt động nếu có nhiều cột hơn sau cột thứ hai, vì -k đọc cho đến khi kết thúc dòng. Giả sử đó là tệp TSV, một giải pháp tốt hơn làsort -t$'\t' -k2 -n FILE
tuxErrante

bạn có thể cần chỉ định dấu phân cách của mình bằng tùy chọn -t
phổ

85

Giải pháp:

sort -k 2 -n filename

được viết rõ ràng hơn như:

sort --key 2 --numeric-sort filename


Thí dụ:

$ cat filename
A 12
B 48
C 3

$ sort --key 2 --numeric-sort filename 
C 3
A 12
B 48

Giải trình:

  • -k # - đối số này chỉ định cột đầu tiên sẽ được sử dụng để sắp xếp. (lưu ý rằng cột ở đây được định nghĩa là một khoảng trắng phân định lĩnh vực; đối số -k5loại sẽ bắt đầu với thứ năm lĩnh vực trong mỗi dòng, không phải là thứ năm nhân vật trong mỗi dòng)

  • -n - tùy chọn này chỉ định "sắp xếp số" có nghĩa là cột nên được hiểu là một hàng số, thay vì văn bản.


Hơn:

Các tùy chọn phổ biến khác bao gồm:

  • -r - tùy chọn này đảo ngược thứ tự sắp xếp. Nó cũng có thể được viết là --reverse .
  • -i - Tùy chọn này bỏ qua các ký tự không in được. Nó cũng có thể được viết là --ignore-nonprinting .
  • -b - Tùy chọn này bỏ qua khoảng trắng hàng đầu, tiện dụng vì khoảng trắng được sử dụng để xác định số lượng hàng. Nó cũng có thể được viết là --ignore-hàng đầu-khoảng trống .
  • -f - Tùy chọn này bỏ qua trường hợp chữ cái. "A" == "a". Nó cũng có thể được viết là --ignore-case .
  • -t [dải phân cách mới] - Tùy chọn này làm cho quá trình tiền xử lý sử dụng toán tử khác với không gian. Nó cũng có thể được viết dưới dạng --field-separator .

Có những lựa chọn khác, nhưng đây là những lựa chọn phổ biến và hữu ích nhất mà tôi thường sử dụng.


@Angelo Câu trả lời này có lẽ được đăng nhiều năm sau khi bạn chấp nhận câu trả lời cho câu hỏi này, nhưng bạn đã xem nó là câu trả lời mới được chấp nhận chưa?
Jonathan Y.

Lựa chọn -tlà tiết kiệm thực tế !! khi các cột của bạn có khoảng trắng và các cột khác nhau bởi một ký tự cho trước như ,hoặc một tab
AKS

12

Đối với các giá trị được phân tách bằng tab, mã bên dưới có thể được sử dụng

sort -t$'\t' -k2 -n

-r có thể được sử dụng để nhận dữ liệu theo thứ tự giảm dần.
-n cho sắp xếp số
-k, --key = POS1 [, POS2] trong đó k là cột trong tệp
Để thứ tự giảm dần bên dưới là mã

sort -t$'\t' -k2 -rn

4

Sử dụng sort.

sort ... -k 2,2 ...

8
Bạn cũng cần sử dụng -n để sắp xếp dựa trên độ tuổi (sắp xếp số). Nếu không, '11' sẽ đến trước '2'.
Matt Ryall
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.