Đếm các giá trị riêng biệt của một trường trong một tệp


16

Tôi có một tập tin chứa khoảng một triệu số dòng. Trong các dòng tôi có một trường được gọi transactionid, có các giá trị lặp lại. Điều tôi cần làm là đếm chúng một cách rõ ràng.

Cho dù giá trị được lặp lại bao nhiêu lần, nó chỉ được tính một lần.


nó sẽ dễ dàng hơn, nếu bạn có thể nhìn thoáng qua định dạng của tệp..không nhất thiết phải là dữ liệu.
Nikhil Mulley

btw, bạn có muốn giá trị được tính là 1 không phân biệt số lần tồn tại của nó, hoặc bạn muốn đếm số lần xuất hiện / lặp lại? Nếu bạn chỉ muốn nó được tính một lần, thì các giá trị khác biệt được tính như thế nào? Bạn có thể vui lòng kiểm tra chỉnh sửa của tôi về câu hỏi của bạn và xác nhận nếu tôi đúng trong việc diễn giải.
Nikhil Mulley

@Nikhil Điều này rõ ràng từ câu hỏi:... No matter of how many times a value is repeated, it should be counted as 1. ...

ok, sau đó trả lời từ @hesse sẽ làm nhu cầu của bạn.
Nikhil Mulley

xin lỗi vì độ trễ Tôi đã ra khỏi kết nối internet. ngăn cách là 2 | ' và trường là trường 28. Tôi đã sử dụng; cat <file_name> | awk -F"|" '{if ((substr($2,0,8)=='20120110')) print $28}' | sort -u | wc -l mệnh đề if là cho một lần kiểm tra ngày khác vì nó có vẻ hiển nhiên :)
Olgun Kaya

Câu trả lời:


22

OK, Giả sử rằng tệp của bạn là tệp văn bản, có các trường được phân tách bằng dấu tách dấu phẩy ','. Bạn cũng sẽ biết lĩnh vực nào 'transactionid'là về vị trí của nó. Giả sử rằng 'transactionid'lĩnh vực của bạn là lĩnh vực thứ 7.

awk -F ',' '{print $7}' text_file | sort | uniq -c

Điều này sẽ tính các lần xuất hiện khác biệt / duy nhất trong trường thứ 7 và in kết quả.


Tại sao sorttrước khi ra uniqlệnh.
g10guang

@ g10guang Trở uniqthành để loại bỏ các hồ sơ mà họ cần phải ở cạnh nhau.
DSz

3

Có thể không phải là phương pháp đẹp nhất, nhưng điều này sẽ hoạt động:

awk '{print $1}' your_file | sort | uniq | wc -l

trong đó $1số tương ứng với trường được phân tích cú pháp.


3

Không cần phải sắp xếp tệp .. ( uniqyêu cầu sắp xếp tệp)
Tập lệnh awk này giả sử trường là trường delimiited khoảng trắng đầu tiên.

awk 'a[$1] == "" { a[$1]="X" } END { print length(a) }' file 

Đối với một tệp khổng lồ (như trong, gần với kích thước của RAM), awk sẽ tiêu tốn rất nhiều bộ nhớ. Hầu hết các sorttriển khai được thiết kế để đối phó tốt với các tệp lớn.
Gilles 'SO- ngừng trở nên xấu xa'
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.