2010-05-06 38 views
5

Tôi có một tệp phân tách bằng tab với 5 cột và cần lấy số lượng các dòng duy nhất từ ​​cột 2. Tôi thường làm điều này với Perl/Python nhưng tôi buộc phải sử dụng vỏ cho cái này.Đếm các giá trị duy nhất trong một cột có một kịch bản lệnh shell

Tôi đã thành công trong quá khứ được sử dụng * nix uniq function piped to wc nhưng có vẻ như tôi sẽ phải sử dụng awk ở đây.

Mọi lời khuyên sẽ được đánh giá cao. (Tôi đã hỏi một câu hỏi tương tự trước đây về kiểm tra cột bằng cách sử dụng awk nhưng điều này hơi khác một chút và tôi muốn tách nó ra sao cho nếu ai đó trong tương lai có câu hỏi này sẽ ở đây)

Rất cám ơn!
Lilly

Trả lời

16

Không cần sử dụng awk.

$ cut -f2 file.txt | sort | uniq | wc -l 

nên làm điều đó.

Điều này sử dụng thực tế là tab là cut của dấu phân cách trường mặc định, vì vậy chúng tôi sẽ chỉ nhận nội dung từ cột hai theo cách này. Sau đó, một đường chuyền qua sort hoạt động như một giai đoạn trước đến uniq, loại bỏ các bản sao. Cuối cùng, chúng tôi đếm các dòng, đó là số được tìm kiếm.

+1

Điều này thật tuyệt. Sau khi rối tung xung quanh tôi phát hiện ra rằng tôi có thể tìm thấy bất kỳ sự lừa dối nào bằng cách này cat file.txt | awk '{print $ 2}' | sắp xếp | uniq -c | sắp xếp -n –

5

tôi đi cho

$ cut -f2 file.txt | sort -u | wc -l 

Ít nhất trong một số phiên bản, uniq dựa trên các dữ liệu đầu vào được sắp xếp (nó chỉ nhìn vào dòng liền kề).

Ví dụ trong Solaris docs:

tiện ích

Các uniq sẽ đọc một tập tin đầu vào so sánh dòng liền kề, và ghi một bản sao của mỗi dòng đầu vào đầu ra. Bản sao thứ hai và thành công thứ hai và tiếp theo của các đầu vào liền kề lặp lại sẽ không được viết.

Các dòng lặp lại trong đầu vào sẽ không phát hiện được nếu chúng không liền kề.

0
awk '{if($0~/Not Running/)a++;else if($0~/Running/)b++}END{print a,b}' temp 
Các vấn đề liên quan