it-swarm-id.com

Bagaimana cara menghitung jumlah kemunculan kata dalam file teks dengan baris perintah?

Saya memiliki file JSON besar yang ada di satu baris, dan saya ingin menggunakan baris perintah untuk dapat menghitung jumlah kemunculan kata dalam file. Bagaimana saya bisa melakukan itu?

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

Di mana tr menggantikan spasi dengan baris baru, grep menyaring semua baris yang dihasilkan yang cocok dengan Word dan wc menghitung yang tersisa.

Seseorang bahkan dapat menyimpan bagian wc menggunakan -c opsi grep:

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

-c opsi didefinisikan oleh POSIX.

Jika tidak dijamin ada spasi di antara kata-kata, Anda harus menggunakan beberapa karakter lain (sebagai pembatas) untuk menggantikan. Misalnya alternatif tr bagiannya

tr '"' '\n'

atau

tr "'" '\n'

jika Anda ingin mengganti tanda kutip ganda atau tunggal. Tentu saja, Anda juga dapat menggunakan tr untuk mengganti beberapa karakter sekaligus (pikirkan jenis spasi dan tanda baca yang berbeda).

Jika Anda perlu menghitung Word tetapi bukan awalanWORD, WORDsuffix, atau prefixWORDsuffix, Anda dapat melampirkan pola Word dalam marker begin/end-of-line:

grep -c '^Word$'

Yang setara dengan marka awal/akhir kata, dalam konteks kami:

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

Dengan GNU grep, ini berfungsi: _grep -o '\<Word\>' | wc -l_

_-o_ mencetak setiap bagian yang cocok dari setiap baris pada baris yang terpisah.

_\<_ menegaskan awal dari sebuah Word dan _\>_ menegaskan akhir dari sebuah Kata (mirip dengan Perl's _\b_), jadi ini memastikan bahwa Anda tidak mencocokkan string di tengah-tengah sebuah kata Kata.

Sebagai contoh,

$ python -c 'impor ini' | grep '\ <one \>' 
 Seharusnya ada satu- dan lebih disukai saja satu - Cara yang jelas untuk melakukannya. 
 Ruang nama adalah satu membunyikan ide bagus - mari kita lakukan lebih banyak lagi! 
$ python -c 'impor ini' | grep -o '\ <one \>' 
satusatusatu$ python -c 'impor ini' | grep -o '\ <one \>' | wc -l 
 3 
25
ephemient

Sayangnya ini tidak berfungsi dengan GNU coreutils.

grep -o -c Word file

Jika itu berfungsi pada platform Anda, itu adalah solusi yang elegan dan cukup intuitif; tapi orang GNU orang masih berpikir.

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 

Perintah ini membuat yang berikut:

  1. Ganti semua karakter non alfanumerik dengan spasi kosong.
  2. Semua jeda baris juga dikonversi menjadi spasi.
  3. Mengurangi semua ruang kosong menjadi satu ruang kosong
  4. Semua spasi sekarang dikonversi ke jeda baris. Setiap kata dalam satu baris.
  5. Menerjemahkan semua kata ke huruf kecil untuk menghindari 'Halo' dan 'Halo' menjadi kata-kata yang berbeda
  6. Urutkan de teks
  7. Menghitung dan menghapus garis yang sama
  8. Urutkan terbalik untuk menghitung kata yang paling sering
  9. Tambahkan nomor baris ke setiap kata untuk mengetahui posisi kata secara keseluruhan

Misalnya jika saya ingin menganalisis pesan Linus Torvald pertama:

Dari: [email protected] (Linus Benedict Torvalds) Newsgroup: comp.os.minix Subjek: Apa yang paling ingin Anda lihat dalam minix? Ringkasan: jajak pendapat kecil untuk sistem operasi baru saya Message-ID: <[email protected]> Tanggal: 25 Agustus 91 20:57:08 GMT Organisasi: University of Helsinki

Halo semua di luar sana menggunakan minix -

Saya sedang melakukan sistem operasi (gratis) (hanya hobi, tidak akan besar dan profesional seperti gnu) untuk 386 (486) AT klon. Ini telah dibuat sejak April, dan mulai bersiap-siap. Saya ingin umpan balik tentang hal-hal yang disukai/tidak disukai orang dalam minix, karena OS saya agak mirip (tata letak fisik yang sama dari sistem file (karena alasan praktis) di antara hal-hal lain).

Saat ini saya porting bash (1,08) dan gcc (1,40), dan semuanya tampak berhasil. Ini menyiratkan bahwa saya akan mendapatkan sesuatu yang praktis dalam beberapa bulan, dan saya ingin tahu fitur apa yang diinginkan kebanyakan orang. Ada saran yang diterima, tetapi saya tidak akan berjanji akan menerapkannya ????

Linus ([email protected])

PS. Ya - ini gratis dari kode minix apa pun, dan memiliki fs multi-utas. Ini TIDAK protable (menggunakan 386 pengalihan tugas dll), dan mungkin tidak akan pernah mendukung apa pun selain AT-hardisk, karena hanya itu yang saya miliki : .

Saya membuat file bernama linus.txt , saya tempel kontennya dan kemudian saya tulis di konsol:

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

Hasil akhirnya adalah:

 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        ...

Jika Anda ingin memvisualisasikan hanya 20 kata pertama:

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

Penting untuk dicatat bahwa perintah tr 'AZ' 'a-z' tidak mendukung UTF-8 --- (belum , sehingga dalam bahasa asing Word APRÈS akan diterjemahkan sebagai April.

Jika Anda hanya ingin mencari kemunculan satu kata, Anda dapat menambahkan grep di bagian akhir:

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$"

Dalam skrip yang disebut search_freq :

#!/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$"

Script harus disebut:

 search_freq Word_to_search_for
7
Roger Borrell

Bergantung pada apakah Anda ingin mencocokkan kata dalam kunci atau dalam nilai data JSON, Anda cenderung ingin mengekstrak hanya kunci atau hanya nilai dari data. Kalau tidak, Anda dapat menghitung beberapa kata terlalu banyak jika muncul sebagai kunci dan nilai.

Untuk mengekstrak semua kunci:

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

Ini secara rekursif menguji apakah benda saat ini adalah objek, dan jika itu, ia mengekstrak kunci. Output akan berupa daftar kunci, satu per baris.

Untuk mengekstrak semua nilai:

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

Ini bekerja dengan cara yang serupa, tetapi memiliki langkah lebih sedikit.

Anda kemudian dapat menyalurkan output di atas melalui grep -c 'PATTERN' (untuk mencocokkan beberapa pola dengan tombol atau nilai), atau grep -c -w -F 'Word' (untuk mencocokkan Word pada kunci atau nilai), atau grep -c -x -F 'Word' (untuk mencocokkan kunci atau nilai lengkap), atau serupa, untuk melakukan penghitungan Anda.

3
Kusalananda

Saya punya json dengan sesuatu seperti ini: "number":"OK","number":OK" diulang beberapa kali dalam satu baris.

Penghitung "OK" saya yang sederhana:

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

0

Menggunakan grep -c Anda hanya akan menghitung baris, satu baris bisa memiliki banyak kemunculan kata.

Ini akan melakukannya:

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