Cách sử dụng awk sort theo cột 3


89

Tôi có một tệp (user.csv) như thế này

ip,hostname,user,group,encryption,aduser,adattr

muốn in tất cả sắp xếp cột theo người dùng,

Tôi đã thử awk -F ":" '{print|"$3 sort -n"}' user.csv, nó không hoạt động.


11
sort -t, -k3 file
Kevin

Câu trả lời:


173

Làm thế nào về chỉ sort.

sort -t, -nk3 user.csv

Ở đâu

  • -t,- xác định dấu phân cách của bạn là ,.

  • -n- cung cấp cho bạn sắp xếp số. Đã thêm vì bạn đã thêm nó trong nỗ lực của bạn. Nếu trường người dùng của bạn chỉ là văn bản thì bạn không cần nó.

  • -k3- xác định trường (khóa). người dùng là trường thứ ba.


2
Làm cách nào để sử dụng sắp xếp 2 cột? ví dụ: tôi muốn sắp xếp theo cột 6 đầu tiên và sắp xếp theo cột 3 giây.
user2452340

1
Điều này sẽ không hoạt động nếu có các chuỗi được trích dẫn chứa dấu phẩy trong CSV (trừ khi cột bạn muốn sắp xếp sớm hơn cột chứa dấu phẩy). Bạn có thể phải vượt qua trước với awk (sử dụng FPAT = "[^,] * | \" [^ \ "] * \" "và OFS =" | "hoặc một số dấu phân tách khác mà bạn có thể sử dụng với sắp xếp)
davemyron

1
@ user2452340 Bạn có thể làm điều này: sort -t, -nk3 filename.csv | sort -t, -nk6- đầu tiên nó sẽ sắp xếp theo cột 3, sau đó sẽ sắp xếp theo cột 6 để cột 6 được sắp xếp đúng theo cách và đối với bất kỳ hàng nào có cột 6 giống nhau, những hàng đó sẽ được sắp xếp theo cột 3 .
Matthew

3
@Matthew sort -t ',' -k3,3n -k6,6nsẽ tốt hơn. -k3sẽ sử dụng cột 3 và phần còn lại của dòng.
Kusalananda

1
Tôi chỉ cần -t, để chia tệp 2 cột của tôi bằng dấu phẩy, cảm ơn jaypal
Ricardo Rivera Nieves

19
  1. Sử dụng awk để đặt ID người dùng ở phía trước.
  2. Sắp xếp
  3. Sử dụng sed để xóa ID người dùng trùng lặp, giả sử rằng ID người dùng không chứa bất kỳ khoảng trắng nào.

    awk -F, '{ print $3, $0 }' user.csv | sort | sed 's/^.* //'
    

Điều này rất hữu ích, đặc biệt nếu bạn cần phân tích cú pháp hoặc kết hợp các cột để thêm trường sắp xếp, sau đó chỉ giữ lại dòng ban đầu. Tôi đã sử dụng awk / split để phân tích cú pháp / kết hợp các trường ngày và giờ để sắp xếp, sau đó xóa.
skytaker

sortđã biết cách sắp xếp theo một cột cụ thể, nhưng kỹ thuật này - được gọi là biến đổi Schwartzian - rất hữu ích khi trường bạn muốn sắp xếp không phải là một cột được xác định rõ ràng.
tripleee

9
awk -F, '{ print $3, $0 }' user.csv | sort -nk2 

và cho thứ tự ngược lại

awk -F, '{ print $3, $0 }' user.csv | sort -nrk2 

9

Bạn có thể chọn dấu phân cách, trong trường hợp này tôi đã chọn dấu hai chấm và in cột số một, sắp xếp theo thứ tự bảng chữ cái:

awk -F\: '{print $1|"sort -u"}' /etc/passwd

6

thử đi -

awk '{print $0|"sort -t',' -nk3 "}' user.csv

HOẶC LÀ

sort -t',' -nk3 user.csv


0

Để loại trừ dòng đầu tiên (tiêu đề) khỏi việc sắp xếp, tôi chia nó thành hai vùng đệm.

df | awk 'BEGIN{header=""; $body=""} { if(NR==1){header=$0}else{body=body"\n"$0}} END{print header; print body|"sort -nk3"}'
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.