it-swarm-tr.com

Komut satırıyla bir metin dosyasındaki bir Word'ün yineleme sayısını nasıl hesaplayabilirim?

Bir satırda büyük bir JSON dosyası var ve ben dosyadaki bir Word yineleme sayısını saymak için komut satırını kullanmak istiyorum. Bunu nasıl yapabilirim?

45
mythz
$ tr ' ' '\n' < FILE | grep Word | wc -l

tr, boşlukları yeni satırlarla değiştirirse, grep, Word ile eşleşen tüm sonuç satırlarını filtreler ve wc kalanları sayar.

wc bölümünü -c grep seçeneği:

$ tr ' ' '\n' < FILE | grep -c Word

-c seçeneği POSIX tarafından tanımlanır.

Sözcükler arasında boşluk olduğu garanti edilmezse, değiştirmek için başka bir karakter (sınırlayıcı olarak) kullanmanız gerekir. Örneğin alternatif tr parçaları

tr '"' '\n'

veya

tr "'" '\n'

çift ​​veya tek tırnak değiştirmek istiyorsanız. Tabii ki, aynı anda birden fazla karakteri değiştirmek için tr kullanabilirsiniz (farklı türdeki boşlukları ve noktalama işaretlerini düşünün).

Word, önekWORD, WORDsuffix veya prefixWORDsuffix değerlerini saymanız gerekmiyorsa, Word desenini satır başı/satır sonu işaretçileri içine alabilirsiniz:

grep -c '^Word$'

Bu bağlamda, Word başlangıç ​​/ bitiş işaretleyicilerine eşdeğerdir:

grep -c '\<Word\>'
48
maxschlepzig

GNU grep ile bu işe yarar: grep -o '\<Word\>' | wc -l

-o Her satırın eşleşen bölümlerini ayrı bir satıra yazdırır.

\< Bir Word'ün başlangıcını ve \> Bir Word'ün sonunu (Perl'in \b Benzeri) belirtir, böylece bu, bir kelimenin ortasında.

Örneğin,

$ python -c 'bunu içe aktar' | grep '\ <one \>' 
 Olmalı bir- ve tercihen sadece bir - bunu yapmanın açık yolu. 
 Ad alanları bir harika bir fikir honking - bunlardan daha fazlasını yapalım! 
$ python -c 'bunu içe aktar' | grep -o '\ <one \>' 
birbirbir$ python -c 'bunu içe aktar' | grep -o '\ <one \>' | wc -l 
 3 
25
ephemient

Bu maalesef GNU coreutils ile çalışmıyor .

grep -o -c Word file

Platformunuzda çalışıyorsa, zarif ve oldukça sezgisel bir çözümdür; ancak GNU millet hala düşünüyor.

11
tripleee
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

Bu komut aşağıdakileri yapar:

  1. Alfasayısal olmayan tüm karakterleri boş bir alanla değiştirin.
  2. Tüm satır sonları da boşluklara dönüştürülür.
  3. Tüm birden çok boş alanı bir boş alana indirger
  4. Artık tüm boşluklar satır sonlarına dönüştürülüyor. Bir satırdaki her Kelime.
  5. 'Merhaba' ve 'merhaba' ifadelerinin farklı kelimeler olmasını önlemek için tüm kelimeleri küçük harfe çevirir
  6. Metni sıralar
  7. Eşit çizgileri sayar ve kaldırır
  8. En sık kullanılan kelimeleri saymak için ters sıralar
  9. Toplamdaki Word pozunu bilmek için her Word'e bir satır numarası ekleyin

Örneğin, ilk Linus Torvald mesajını analiz etmek istersem:

Gönderen: [email protected] (Linus Benedict Torvalds) Haber Grupları: comp.os.minix Konu: Minix'te en çok ne görmek isterdiniz? Özet: yeni işletim sistemim için küçük anket Mesaj-ID: <[email protected]> Tarih: 25 Ağu 91 20:57:08 GMT Organizasyon: Helsinki Üniversitesi

Herkese merhaba minix kullanarak -

386 (486) AT klonlar) için (ücretsiz) bir işletim sistemi (sadece bir hobi, gnu gibi büyük ve profesyonel olmayacak) yapıyorum. Bu nisandan beri bira yapıyor ve İşletim sistemim biraz benzediği için (pratik nedenlerden dolayı) diğer şeylerin yanı sıra dosya sisteminin aynı fiziksel düzeni), insanların minix'te sevdikleri/sevmedikleri şeyler hakkında herhangi bir geri bildirim istiyorum.

Şu anda bash (1.08) ve gcc (1.40) kullandım ve işler işe yarıyor gibi görünüyor. Bu, birkaç ay içinde pratik bir şey yapacağım ve çoğu insanın hangi özellikleri isteyeceğini bilmek istiyorum. Herhangi bir öneri bekliyoruz, ama onları uygulayacağım söz vermeyeceğim ????

Linus ([email protected])

PS. Evet - herhangi bir minix kodu içermez ve çok iş parçacıklı bir fs'ye sahiptir. Protable DEĞİLDİR (386 görev değiştirme vb kullanır) ve muhtemelen AT-harddiskler dışında hiçbir şeyi desteklemeyecektir, çünkü sahip olduğum tek şey bu : .

linus.txt adlı bir dosya oluşturuyorum, içeriği yapıştırıyorum ve sonra konsola yazıyorum:

sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

Çıkışı şöyle olurdu:

 1        7 i
 2        5 to
 3        5 like
 4        5 it
 5        5 and
 6        4 minix
 7        4 a
 8        3 torvalds
 9        3 of
10        3 helsinki
11        3 fi
12        3 any
13        2 would
14        2 won
15        2 what
16        ...

Yalnızca ilk 20 kelimeyi görselleştirmek istiyorsanız:

sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | head -n 20

tr 'AZ' 'a-z' komutunun UTF-8'i desteklemediğini unutmamak önemlidir --- (henüz , böylece yabancı dilde APRÈS kelimesi nisan olarak çevrilir.

Yalnızca bir Word'ün oluşumunu aramak istiyorsanız, sonunda bir grep ekleyebilirsiniz:

sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\sword_to_search_for$"

search_freq adlı bir komut dosyasında:

#!/bin/bash
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\s$1$"

Betik çağrılmalıdır:

 search_freq Word_to_search_for
7
Roger Borrell

Anahtarlarda veya JSON verilerinin değerlerinde Word ile eşleşmek isteyip istemediğinize bağlı olarak, yalnızca anahtarları veya yalnızca verilerdeki değerleri ayıklamak isteyebilirsiniz. Aksi takdirde, hem anahtar hem de değer olarak ortaya çıkarsa bazı kelimeleri çok fazla sayabilirsiniz.

Tüm anahtarları çıkarmak için:

jq -r '..|objects|keys[]' <file.json

Bu, geçerli şeyin bir nesne olup olmadığını yinelemeli olarak test eder ve öyleyse anahtarları çıkarır. Çıktı, her satıra bir tane olacak şekilde bir anahtar listesi olacaktır.

Tüm değerleri çıkarmak için:

jq -r '..|scalars' <file.json

Bu benzer şekilde çalışır, ancak daha az adım vardır.

Daha sonra yukarıdakilerin çıkışını grep -c 'PATTERN' (bazı desenleri tuşlarla veya değerlerle eşleştirmek için) veya grep -c -w -F 'Word' (tuşlarda veya değerlerde bir Word ile eşleştirmek için) veya grep -c -x -F 'Word' (tam bir anahtar veya değerle eşleştirmek için) veya benzeri sayımınızı yapmak için.

3
Kusalananda

Bunun gibi bir şey ile json var: "number":"OK","number":OK" bir satırda birden çok kez tekrarlandı.

Basit "Tamam" sayacım:

sed "s|,|\n|g" response | grep -c OK

0

grep -c Kullanarak yalnızca satırları sayacaksınız, bir satırda Word'ün birçok örneği olabilir.

Bunu yapar:

grep -o Word foo|wc -l
0
Ramiro Velazquez