Sortir dan hitung jumlah kemunculan garis


145

Saya memiliki file Apachelog,, access.logbagaimana cara menghitung jumlah kemunculan baris dalam file itu? misalnya hasil dari cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'is

a.php
b.php
a.php
c.php
d.php
b.php
a.php

hasil yang saya inginkan adalah:

3 a.php
2 b.php
1 d.php # order doesn't matter
1 c.php 

25
| sort | uniq -c
— Costas

3
| LC_ALL=C sort | LC_ALL=C uniq -c
— Stéphane Chazelas

ah saya tidak pernah tahu itu uniqbisa melakukan itu ..
— Kokizzu

Apakah Anda memiliki contoh baris di log, karena saya pikir ini semua bisa dilakukan dengan awk tanpa semua pipa.

tidak apa-apa, file log 8.1GB diproses dalam waktu sekitar 2 menit, dan selesai sekarang, tidak perlu lagi ini: 3
— Kokizzu

Jawaban:


197
| sort | uniq -c

Sebagaimana dinyatakan dalam komentar.

Menyalurkan output ke sortmengatur output ke urutan abjad / numerik.

Ini adalah persyaratan karena uniqhanya cocok pada baris yang berulang, yaitu

a
b
a

Jika Anda menggunakan uniqfile teks ini, itu akan mengembalikan yang berikut:

a
b
a

Ini karena kedua as dipisahkan oleh b- mereka bukan garis berurutan. Namun jika Anda terlebih dahulu mengurutkan data menjadi urutan abjad seperti pertama

a
a
b

Kemudian uniqakan menghapus garis yang berulang. The -cpilihan untuk uniqjumlah jumlah duplikat dan menyediakan output dalam bentuk:

2 a
1 b

Referensi:


1
Selamat datang di Unix & Linux :) Jangan ragu untuk menambahkan rincian lebih lanjut ke jawaban Anda dan jelaskan mengapa dan bagaimana ini bekerja;)
— John WH Smith

1
printf '%s\n' ①.php ②.php | sort | uniq -cmemberi saya2 ①.php
— Stéphane Chazelas

@ StéphaneChazelas Thats karena printf mencetakphp\nphp

4
@Jidder, tidak, itu karena ①.phpjenisnya sama dengan ②.phpdi lokal saya karena tidak ada urutan penyortiran yang ditentukan untuk mereka ①dan ②karakter di lokal saya. Jika Anda ingin yang unik nilai untuk setiap nilai byte (ingat path file tidak selalu text), maka Anda harus memperbaiki lokal ke C: | LC_ALL=C sort | LC_ALL=C uniq -c.
— Stéphane Chazelas

2
Untuk mengurutkan file hitungan yang dihasilkan, Anda harus mempertimbangkan untuk menambahkan "sort -nr" sebagai jawaban @ eduard-florinescu di bawah ini.
— Lluís Suñol

104
[your command] | sort | uniq -c | sort -nr

Jawaban yang diterima hampir selesai Anda mungkin ingin menambahkan ekstra sort -nrdi akhir untuk mengurutkan hasil dengan garis yang paling sering muncul terlebih dahulu

opsi uniq :

-c, --count
       prefix lines by the number of occurrences

opsi pengurutan :

-n, --numeric-sort
       compare according to string numerical value
-r, --reverse
       reverse the result of comparisons

Dalam kasus tertentu adalah garis yang Anda sortir adalah angka, Anda perlu menggunakan sort -gralih-alih sort -nr, lihat komentar


3
Terima kasih banyak telah memberi tahu saya tentang -nopsi.
— Sigur

2
Jawaban yang bagus, inilah yang saya gunakan untuk mendapatkan wordcount keluar file dengan kalimat: tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt. Perintah pertama menggantikan spasi dengan baris baru, memungkinkan sisa perintah untuk bekerja seperti yang diharapkan.
— Bar

2
Dengan menggunakan opsi di atas saya mendapatkan "1" sebelum "23344". Menggunakan sort -grbukan memecahkan ini. -g: bandingkan menurut nilai numerik umum (bukan -n: bandingkan menurut nilai numerik string).
— Peter Jaric

@PeterJaric Tangkapan yang hebat dan sangat berguna untuk diketahui, -grtetapi saya pikir hasilnya uniq -cakan seperti yang sort -nrakan berfungsi sebagaimana dimaksud
— Eduard Florinescu

3
Sebenarnya, ketika data berupa angka, -grberfungsi lebih baik. Coba dua contoh ini, hanya berbeda pada tanda g dan n: echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrdan echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr. Jenis pertama salah, tapi bukan yang kedua.
— Peter Jaric

9

Anda dapat menggunakan array asosiatif pada awk dan kemudian -optionally- sort :

cat access.log  | awk ' { tot[$0]++ } END { for (i in tot) print tot[i],i } ' | sort

keluaran:

1 c.php
1 d.php
2 b.php
3 a.php

Bagaimana Anda menghitung jumlah kemunculan ketika pipa mengirimkan data?
— user123456
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.