Đếm số lần xuất hiện trong cột đầu tiên của tệp


9

Chúng tôi có tập tin này:

1 2 
1 3
1 2
3 3
52 1
52 300

và hơn 1000.

Tôi muốn đếm số lần mỗi giá trị xảy ra trong cột đầu tiên.

1  3 
3  1
52 2

Điều này có nghĩa là chúng tôi đã thấy 1ba lần.

Làm thế nào tôi có thể làm điều đó, trong Perl, AWK hoặc Bash?


3
Xin chào arashams! Tôi thấy bạn gần đây đã hỏi những câu hỏi rất giống nhau mà tất cả đều xoay quanh cùng một chủ đề. Tôi chắc chắn cộng đồng muốn giúp bạn, nhưng có lẽ bạn có thể cho chúng tôi thấy những gì bạn đã thử và chính xác nơi bạn bị mắc kẹt? Chúng tôi yêu cầu mọi người thể hiện một chút nỗ lực trước khi đặt câu hỏi của họ - không có bất kỳ việc học nào liên quan đến việc chỉ yêu cầu người khác cung cấp cho bạn mã cho một điều cụ thể. Tại sao không cho chúng tôi biết chính xác nền tảng của điều này là gì? Có lẽ có một cách dễ dàng hơn để thực hiện những gì bạn muốn, và chúng ta không cần phải dùng đến các ví dụ giả với một số số trừu tượng?
slhck

tnx giúp đỡ của bạn. Tôi đang làm việc với dữ liệu bgpdump và phân tích chúng.
Arash

Câu trả lời:


12

Nếu đầu vào được sắp xếp, bạn có thể sử dụng uniq:

<infile cut -d' ' -f1 | uniq -c

Nếu không, hãy sắp xếp nó trước:

<infile cut -d' ' -f1 | sort -n | uniq -c

Đầu ra:

  3 1                                      
  1 3
  2 52

Đầu ra được hoán đổi so với yêu cầu của bạn, bạn có thể sử dụng awk '{ print $2, $1 }'để thay đổi điều đó.

1 3 
3 1
52 2

Ngoài ra còn có thành ngữ awk, không yêu cầu đầu vào được sắp xếp:

awk '{h[$1]++}; END { for(k in h) print k, h[k] }'

Đầu ra:

1 3
52 2
3 1

Vì đầu ra ở đây xuất phát từ hàm băm nên nó sẽ không được đặt hàng, chuyển đến sort -nnếu cần:

awk '{h[$1]++} END { for(k in h) print k, h[k] }' | sort -n

Nếu bạn đang sử dụng GNU awk, bạn có thể thực hiện sắp xếp từ bên trong awk:

awk '{h[$1]++} END { n = asorti(h, d, "@ind_num_asc"); for(i=1; i<=n; i++) print d[i], h[d[i]] }'

Trong hai trường hợp cuối, đầu ra là:

1 3
3 1
52 2

tnx .its đã hoạt động :)
Arash

bạn có thể giải thích mã ??? awk '{h [$ 1] ++} END {cho (k in h) in k, h [k]}' | sort -n
Arash

3
@arashams: {h[$1]++}Khối được ước tính cho mỗi dòng. hlà một hàm băm và $1là cột đầu tiên và được sử dụng làm khóa vào h. Vì vậy, nàng tiên này thường thấy những cái độc đáo như thế nào $1. Các ENDkhối được thực hiện ở phần cuối của đầu vào, và in các phím và tallies. sort -nsắp xếp đầu ra bằng số.
Thor
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.