Saya memiliki file dalam format sebagai berikut:
$ cat file.txt
27.33.65.2
27.33.65.2
58.161.137.7
121.50.198.5
184.173.187.1
184.173.187.1
184.173.187.1
Apa cara terbaik untuk mem-parsing file file.txt
ke dalam format seperti:
27.33.65.2: 2
58.161.137.7: 1
121.50.198.5: 1
184.173.187.1: 3
Dengan kata lain, saya ingin mengulang-ulang file dan menghitung berapa kali setiap alamat IP muncul. Saya sudah menjalankannya sort
sehingga semua alamat IP dalam urutan dan langsung setelah satu sama lain.
Jawaban:
Kamu sedang mencari
uniq -c
Jika hasilnya tidak sesuai dengan keinginan Anda, itu bisa diurai dan diformat ulang dengan mudah.
Sebagai contoh:
sumber
uniq
danawk
tampaknya bukan pendekatan yang bagus untuk saya ...uniq
hanya berfungsi pada input yang diurutkan (cocok dengan baris yang cocok yang berdekatan, bukan baris apa pun dari file).sort
!uniq
tampaknya menjadi solusi yang lebih pintar. Cara awk:sumber
sort
jawaban saya masih lebih cepat karena lebih sedikit barang yang harus disortir. ;-)firest sort file kemudian hitung dengan unic -c
sort filename | uniq -c
sumber
uniq -c
akan berfungsi tetapi memberikan output pada format yang salah. Inilah sebabnya mengapa jawaban yang diterima tidak menggunakansort
dan malah memformat ulang keluaranuniq -c
.Saya akan menggunakan python. Setiap batang linux saat ini telah menginstal python2.
Tambahkan setiap alamat ip ke dalam dict (array asosiatif) sebagai kunci = pasangan nilai yaitu {"12.34.56.78": 1, "87.76.43.21": 3}.
Anda 'memverifikasi' alamat ip sebagai kunci dan menambah nilainya dengan 1. Jika Anda menggunakan defaultdict ("ip"), jika kunci tidak ada, itu dibuat dengan nilai default 0. Jika kunci memang ada sudah, defaultdict tidak melakukan apa-apa. Nilai bertambah pada baris berikutnya.
file keluar:
Saya tahu Anda mencari solusi baris perintah, tetapi seperti yang Anda lihat, ini adalah tampilan yang diformat secara elegan yang hanya membutuhkan sekitar selusin baris. Python adalah alat yang sangat baik untuk administrasi.
sumber