Dapatkan jumlah kata kata file file teks dari semua kata & output cetak diurutkan


28

Saya punya perintah yang akan bekerja melalui file teks, menghitung semua kemunculan kata-kata dan mencetaknya seperti ini:

user@box $˜ magic-command-i-forgot | with grep | and awk | sort ./textfile.txt
66: the
54: and
32: I
16: unix
12: bash
5:  internet
3:  sh
1: GNU/Linux

Jadi ia tidak mencari baris demi baris, tetapi kata demi kata, dan ia melakukannya untuk semua kata, bukan hanya untuk 1 kata. Saya telah menemukannya di suatu tempat di internet sejak lama, tetapi saya tidak dapat menemukan atau mengingatnya ..

Jawaban:


33

Saya akan menggunakan tralih-alih awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr hanya mengganti spasi dengan baris baru
  • grep -v "^\s*$" memotong garis kosong
  • sort untuk mempersiapkan sebagai masukan untuk uniq
  • uniq -c untuk menghitung kejadian
  • sort -bnr mengurutkan dalam urutan terbalik numerik sambil mengabaikan spasi putih

Wow. itu ternyata menjadi perintah besar untuk menghitung sumpah per baris

temukan. -nama "* .py" -exec cat {} \; | tr '[: spasi:]' '[\ n *]' | grep -v "^ \ s * $" | sortir | uniq -c | sort -bnr | grep fuck


Mungkin ingin digunakan tr -suntuk menangani banyak ruang, terutama saat menemukan lekukan.
Arcege

@Arcege: Poin bagus. Meskipun tidak akan mengubah hasilnya, script mungkin akan sedikit kencang.
Seler

-g( --general-numeric-sort) opsi sortmungkin lebih disukai dalam beberapa kasus. Misalnya sort -nakan tetap 10\n1 4apa adanya, memperlakukan 1 4apa adanya 14, sementara sort -gakan memperlakukannya dengan benar 1 4\n10.
Skippy le Grand Gourou

perintah yang bagus, benar-benar layak untuk diambil suara :)
Noor

@seler Saya pikir Anda dapat membuat bagian grep dan tr lebih sederhana seperti di bawah ini: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrPerhatikan bahwa saya seorang pemula, jadi saya mungkin salah, silakan memberi saran.
smc

8
  1. Bagi input menjadi kata-kata, satu per baris.
  2. Sortir daftar kata yang dihasilkan (garis).
  3. Squash beberapa kejadian.
  4. Urutkan berdasarkan jumlah kejadian.

Untuk membagi input menjadi kata-kata, ganti karakter apa pun yang Anda anggap sebagai pemisah kata oleh baris baru.

<input_file \
tr -sc '[:alpha:]' '[\n*]' | # Add digits, -, ', ... if you consider
                             # them word constituents
sort |
uniq -c |
sort -nr

Ini adalah jawaban yang bagus karena dapat menangani kasus di mana kata-kata tepat di sebelah tanda baca non-kata yang ingin Anda abaikan.
David Grayson

5

Tidak menggunakan grep dan awk tetapi ini tampaknya melakukan apa yang Anda inginkan:

for w in `cat maxwell.txt`; do echo $w; done|sort|uniq -c
  2 a
  1 A
  1 an
  1 command
  1 considered
  1 domain-specific
  1 for
  1 interpreter,
  2 is
  1 language.
  1 line
  1 of

1
Ini tidak akan berfungsi jika input berisi wildcard shell (Anda perlu menambahkan set -f), dan memperlakukan tanda baca sebagai bagian dari kata-kata (yang dapat diperbaiki dengan canggung dengan menambahkan karakter tanda baca ke IFS- semoga berhasil mendukung set karakter non-ASCII). Ini tidak akan bagus dengan file input yang sangat besar, karena menyimpan seluruh file dalam memori ( sortlebih pintar).
Gilles 'SO- stop being evil'

2

Saya percaya Anda mencari sesuatu seperti ini?

$ perl -n -e 'foreach ${k} (split(/\s+/)){++$h{$k}};END{foreach $l (keys(%h)){print "$h{$l}: ${l}\n"}}' /path/to/your/file | sort -n -k 1

tentu saja kamu juga bisa melakukan hal yang sama awk:)


2

Menggunakan awk/sort/uniqsolusi:

awk '{for(w=1;w<=NF;w++) print $w}' ~/textFile.txt | sort | uniq -c | sort -nr

Indah! Ini bekerja dengan sempurna.
stidmatt

0
file=/home/stefan/ooxml1.txt
for word in $(sed 's/[^A-Za-z]/ /g' $file | tr " " "\n" | sort -u)
do
  echo -n "$word "
  grep -c $word $file
done | sort -k2 -n 

macam naik setelah membelah file menjadi kata-kata.

The grep sederhana akan menemukan fishdi fisheye, jadi Anda harus meningkatkan perintah grep untuk mencegah pertandingan parsial.

Memakan waktu 3 detik untuk file teks 25k pada mesin di zaman dulu, HDD klasik (IDE).

Untuk file yang lebih besar atau operasi yang sering dilakukan pendekatan peta hash akan lebih baik, tetapi untuk pekerjaan yang jarang dijalankan atau file yang lebih kecil saja, itu mungkin sudah cukup.

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.