2009-09-03 30 views
11

Tôi muốn sắp xếp trên một cột nhất định chỉ cho các hàng có chứa một từ nhất định. Tôi không muốn thấy các hàng không chứa từ đó. Ví dụ tôi có file văn bản này:Cách sắp xếp trên cột cho các hàng có chứa một từ nhất định

sdf ggfds 7 
sdf sgs  5 
sdf dfgs 3 
foo dffg 2 
bar dffg 2 
sdf sddfg 4 

Tôi muốn sắp xếp cột thứ 3 cho các hàng chỉ chứa "sdf" từ (doesnt có được trong một cột đầu tiên)

và tôi muốn nhìn thấy đầu ra này :

sdf dfgs 3 
sdf sddfg 4 
sdf sgs  5 
sdf ggfds 7 

Trả lời

15

ống đầu vào của bạn đến một lệnh bên ngoài:

:%!grep sdf | sort -n -k3 

chi tiết:

  1. chọn toàn bộ nội dung bằng cách sử dụng '%'
  2. tô nó vào lệnh bên ngoài bằng '!'
  3. grep onyl các dòng có chứa 'sdf'
  4. loại những dòng này về số (-n) trên các lĩnh vực thứ ba (-k3)
  5. lệnh
+0

Tất nhiên, đây chỉ là bất kỳ tốt nếu bạn đang ở trên một máy tính với grep và sắp xếp cài đặt - nhiều người sử dụng Vim trên Windows sẽ tìm thấy điều này sẽ không làm việc và có thể không muốn cài đặt gnuwin32 hoặc cygwin. – DrAl

+0

Cho đến nay, đây là câu trả lời hay nhất và trực quan nhất! – vehomzzz

8

2 vim:

:v/sdf/d 
:sort n /[^[:digit:]]*/ 
  • đầu tiên xóa tất cả các dòng không chứa 'sdf'
  • số thứ tự sắp xếp bỏ qua số không
+0

+1: Một cách Vim bản địa tốt để làm điều đó mà không cần phải sinh ra một vỏ bên ngoài. – DrAl

+0

một cách intersting, Maxim, nhưng tôi cũng muốn sắp xếp trên một cột cụ thể – vehomzzz

+0

yep, nó đến mà sắp xếp của os làm cho nó dễ dàng hơn để sắp xếp theo một cột cụ thể nhưng bạn có thể sử dụng: sắp xếp n/\ v (\ S + \ s +) {2}/để làm tương tự trong vim như Al chỉ ra. –

3

Maxim Kim đã đưa ra một câu trả lời tuyệt vời và tôi sẽ thêm điều này vào bình luận, nhưng nó quá phức tạp nên tôi sẽ dán nó vào một câu trả lời:

Bạn có thể đơn giản hóa mẫu bằng cách sử dụng:

:v/sdf/d 
sort n /\D*/ 

như \D tương đương với [^[:digit:]] và ít nhiều gõ. Để biết thêm thông tin, xem

:help \D 

Để phù hợp trên các lĩnh vực thứ ba cụ thể, chứ không phải chỉ là chữ số đầu tiên, sử dụng

:sort n /\(\S\+\s+\)\{2}/` 

hoặc

:sort n /\v(\S+\s+){2}/ 

Xem:

:help :sort 
:help \S 
:help \s 
:help pattern.txt 
:help \v 

Là một sang một bên, một số fi thứ dễ nhớ hơn :g!/sdf/d, giống như :v/sdf/d - :g! là đối diện của :g và giống hệt với :v.

:help :v 
:help :g 
3

Sắp xếp theo cột thứ 2 bằng cách chọn nó trong chế độ trực quan (ví dụ:kiểm soát + v), sau đó chạy:

!sort 

hoặc để sắp xếp theo cột thứ 3

sort -k 3 

hoặc

:sort /.*\%3v/ 

Ngoài ra chọn dòng bạn muốn sắp xếp bằng cách sử dụng Shift + V lệnh. Sau đó nhập

!sort -k 3n 

hoặc sử dụng mã dưới đây để cho Vim để bỏ hai chữ đầu tiên trong mỗi dòng và sắp xếp trên bất cứ điều gì sau:

:%sort /^\S\+\s\+\S\+\s\+/ 

hoặc tức là sắp xếp theo dòng 8:

:sort /.*\%55v/ 

Đặc tả 'ảo' là số cột tuyệt đối, xử lý dấu cách + tab là ký tự đơn (không bao lâu, nó không tính các tab là tám dấu cách),

nên để sắp xếp theo cột cuối cùng:

:%sort /\<\S\+\>$/ r 
Các vấn đề liên quan