Satırların oluşumunu sıralama ve sayma


145

Ben var Apachegünlük dosyası, access.lognasıl bu dosyada çizgi oluşum sayısını saymak için? Örneğin sonucu cut -f 7 -d ' ' | cut -d '?' -f 1 | tr '[:upper:]' '[:lower:]'olan

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

İstediğim sonuç:

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, uniqbunu yapabileceğini asla bilemedim ..
Kokizzu

Sanırım tüm bunlar, tüm borular olmadan awk ile yapılabileceğini düşünüyorum.

Tamam, 8,1GB günlük dosyası yaklaşık 2 dakika içinde işleme koyuldu ve şu an için yapıldı. Artık buna gerek yok: 3
Kokizzu

Yanıtlar:


196
| sort | uniq -c

Yorumlarda belirtildiği gibi.

Çıktıyı boruya koymak sortçıktıyı alfabetik / sayısal sıraya göre düzenler.

Bu bir gerekliliktir çünkü uniqsadece tekrarlanan satırlarda eşleşir, yani

a
b
a

uniqBu metin dosyasını kullanırsanız , aşağıdakileri döndürür:

a
b
a

Bunun nedeni, iki maddenin abirbirleriyle ayrılmasıdır b- ardışık çizgiler değildir. Ancak, önce verileri önce alfabetik olarak sıralarsanız,

a
a
b

Sonra uniqyinelenen çizgileri kaldıracak. Sayma -cseçeneği, uniqkopya sayısını sayar ve formda çıktı sağlar:

2 a
1 b

Referanslar:


1
Unix & Linux'a Hoş Geldiniz :) Cevabınıza daha fazla ayrıntı eklemek ve bunun neden ve nasıl işlediğini açıklamaktan çekinmeyin;)
John WH Smith

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

@ StéphaneChazelas Bu, çünkü printf baskı yapıyorphp\nphp

4
@Jidder, hayır, çünkü bu, yerel ayarlarımdakilerle ①.phpaynı ②.phpsıralama yapmıyor çünkü yerel ayarlarımdakiler ve karakterler için sıralama düzeni tanımlanmadı . Herhangi bir bayt değeri için benzersiz değerler istiyorsanız (dosya yollarının mutlaka metin olmadığını unutmayın), o zaman yerel ayarı C: konumuna getirmeniz gerekir | LC_ALL=C sort | LC_ALL=C uniq -c.
Stéphane Chazelas

2
Elde edilen sayım dosyasının sıralanmasını sağlamak için "sort -nr" ifadesini aşağıdaki @ eduard-florinescu yanıtları olarak eklemeyi düşünmelisiniz.
Lluís Suñol

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

Kabul edilen cevap neredeyse tamamlandı sort -nr, sonuçları en sık ortaya çıkan satırlara göre sıralamak için sonuna bir ekstra eklemek isteyebilirsiniz.

uniq seçenekleri:

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

sıralama seçenekleri:

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

Özel durumda, sıraladığınız satırlar sayılardı, sort -grbunun yerine kullanmanız gerekir sort -nr, yorumu görün


3
Bana -nseçenek hakkında bilgi verdiğin için çok teşekkür ederim .
Sigur

2
Güzel cevap, burada cümlelerle dosyanın dışında bir wordcount almak için kullandığınız ne: tr ' ' '\n' < $FILE | sort | uniq -c | sort -nr > wordcount.txt. İlk komut, boşlukların yerine yeni satırları yerleştirir ve komutun geri kalanının beklendiği gibi çalışmasını sağlar.
Bar,

2
Yukarıdaki seçenekleri kullanarak "23344" den önce "1" alıyorum. sort -grBunun yerine kullanmak bunu çözer. -g: genel sayısal değere göre karşılaştır (yerine -n: string sayısal değere göre karşılaştır).
Peter Jaric

@PeterJaric Büyük yakalamak ve bilmek çok faydalı -grama sanırım çıktısının amaçlandığı uniq -cgibi çalışacağını düşünüyorumsort -nr
Eduard Florinescu

3
Aslında, veriler sayı olduğunda, -grdaha iyi çalışır. Yalnızca g ve n bayraklarında farklı olan bu iki örneği deneyin: echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -nrve echo "1 11 1 2" | tr ' ' '\n' | sort | uniq -c | sort -gr. İlki yanlış sıralama yapıyor, ikincisi yanlış.
Peter Jaric

9

Awk üzerinde bir ilişkisel dizi kullanabilir ve ardından -optionally- sort :

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

çıktı:

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

Boru veri gönderirken oluşma sayısını nasıl hesaplarsınız?
user123456,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.