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?
bash
command-line
grep
json
mitos
sumber
sumber
{ "key": "the key" }
harus menghitung stringkey
sekali atau dua kali.Jawaban:
Di mana
tr
menggantikan spasi dengan baris baru,grep
filter semua garis yang dihasilkan cocok dengan KATA danwc
menghitung yang tersisa.Satu bahkan dapat menyimpan
wc
bagian menggunakan-c
opsi grep:The
-c
opsi didefinisikan oleh POSIX.Jika tidak dijamin ada spasi di antara kata-kata, Anda harus menggunakan beberapa karakter lain (sebagai pembatas) untuk menggantikan. Sebagai contoh
tr
adalah bagian alternatifatau
jika Anda ingin mengganti tanda kutip ganda atau tunggal. Tentu saja, Anda juga dapat menggunakan
tr
untuk mengganti beberapa karakter sekaligus (pikirkan berbagai jenis spasi putih dan tanda baca).Jika Anda perlu menghitung WORD tetapi bukan awalanWORD, WORDsuffix, atau prefixWORDsuffix, Anda dapat melampirkan pola WORD di marker begin / end-of-line:
Yang setara dengan penanda awal-akhir kata, dalam konteks kami:
sumber
tr
perintah yang melakukan pekerjaan alih-alih menyarankan contoh yang tidak akan pernah berhasil dalam semua situasi. Itu juga akan cocok dengan kata-kata yang mengandung kata yang Anda cari. Thegrep -o '\<WORD\>' | wc -l
solusi adalah jauh lebih unggul.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 kata dan\>
menegaskan akhir kata (mirip dengan Perl\b
), jadi ini memastikan bahwa Anda tidak mencocokkan string di tengah kata.Sebagai contoh,
sumber
grep -wo WORD | wc -l
Sayangnya ini tidak bekerja dengan GNU
coreutils
.Jika itu berfungsi pada platform Anda, itu adalah solusi yang elegan dan cukup intuitif; tetapi orang-orang GNU masih berpikir.
sumber
grep
memiliki bug di sini. Tidak jelas dari POSIX apa semantik menggabungkan-c
dan-o
harus jadi ini saat ini tidak portabel. Terima kasih atas komentarnya; Saya telah memperbarui jawaban ini.Perintah ini membuat yang berikut:
Misalnya jika saya ingin menganalisis pesan Linus Torvald pertama:
Saya membuat file bernama linus.txt , saya tempel kontennya dan kemudian saya tulis di konsol:
Hasil akhirnya adalah:
Jika Anda ingin memvisualisasikan hanya 20 kata pertama:
Penting untuk dicatat bahwa perintah tr 'AZ' 'a-z' tidak suport UTF-8 belum , sehingga dalam bahasa asing sekian menyala kata akan diterjemahkan sebagai Apres.
Jika Anda hanya ingin mencari kemunculan satu kata, Anda dapat menambahkan grep di bagian akhir:
Dalam skrip yang disebut search_freq :
Script harus disebut:
sumber
sed: -e expression #2, char 7: unterminated
'perintah`, ini juga menghitung semua kata, kan? Tapi OP hanya bertanya satu. Juga sedikit penjelasan akan menyenangkan.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:
Ini secara rekursif menguji apakah benda saat ini adalah objek, dan jika ya, ia mengekstrak kunci. Output akan berupa daftar kunci, satu per baris.
Untuk mengekstrak semua nilai:
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 terhadap kunci atau nilai), ataugrep -c -w -F 'WORD'
(untuk mencocokkan kata dalam kunci atau nilai), ataugrep -c -x -F 'WORD'
(untuk mencocokkan kunci atau nilai lengkap), atau serupa, dengan lakukan penghitungan Anda.sumber
Saya memiliki 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
sumber
i Telah menggunakan perintah awk di bawah ini untuk menemukan jumlah kemunculan
contoh file
file cat1
perintah:
keluaran
sumber
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.