Menghitung kejadian di kolom pertama file

9

Kami memiliki file ini:

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

dan 1000 lainnya.

Saya ingin menghitung berapa kali setiap nilai muncul di kolom pertama.

1  3 
3  1
52 2

Ini berarti kami melihat 1tiga kali.

Bagaimana saya bisa melakukan itu, di Perl, AWK atau Bash?

Arash
sumber
3
Hai, arasham! Saya melihat Anda baru-baru ini mengajukan pertanyaan yang sangat mirip yang semuanya berkisar pada topik yang sama. Saya yakin komunitas ingin membantu Anda, tetapi mungkin Anda bisa menunjukkan kepada kami apa yang sudah Anda coba dan di mana tepatnya Anda terjebak? Kami meminta orang untuk menunjukkan sedikit usaha sebelum mengajukan pertanyaan mereka - tidak ada pembelajaran yang terlibat dari hanya meminta orang lain untuk memberi Anda kode untuk hal tertentu. Mengapa tidak memberi tahu kami apa sebenarnya latar belakang ini? Mungkin ada cara yang lebih mudah untuk mencapai apa yang Anda inginkan, dan kita tidak perlu menggunakan contoh dummy dengan beberapa angka abstrak?
slhck
tnx atas bantuan Anda. Saya bekerja dengan data bgpdump dan menguraikannya.
Arash

Jawaban:

12

Jika input diurutkan, Anda dapat menggunakan uniq:

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

Jika tidak, urutkan terlebih dahulu:

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

Keluaran:

  3 1                                      
  1 3
  2 52

Outputnya ditukar dibandingkan dengan kebutuhan Anda, Anda dapat menggunakannya awk '{ print $2, $1 }'untuk mengubahnya.

1 3 
3 1
52 2

Ada juga idiom awk, yang tidak memerlukan input yang diurutkan:

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

Keluaran:

1 3
52 2
3 1

Karena output di sini berasal dari hash maka tidak akan dipesan, terima sort -njika itu diperlukan:

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

Jika Anda menggunakan GNU awk, Anda dapat melakukan pengurutan dari dalam awk:

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

Dalam dua kasus terakhir hasilnya adalah:

1 3
3 1
52 2
Thor
sumber
tnx .tits berhasil :)
Arash
bisakah Anda menjelaskan kode ??? awk '{h [$ 1] ++} END {untuk (k in h) cetak k, h [k]}' | sort -n
Arash
3
@arashams: {h[$1]++}Blok dievaluasi untuk setiap baris. hadalah hash dan $1merupakan kolom pertama dan digunakan sebagai kunci h. Jadi ini menghitung seberapa sering unik $1terlihat. The ENDblok dijalankan pada akhir masukan, dan mencetak kunci dan penghitungan. sort -nmengurutkan output secara numerik.
Thor