Nhận số lần xuất hiện của tệp văn bản của tất cả các từ và đầu ra in được sắp xếp


28

Tôi đã có một lệnh sẽ làm việc thông qua một tệp văn bản, đếm tất cả các lần xuất hiện của các từ và in ra như thế này:

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

Vì vậy, nó không tìm kiếm từng dòng một, mà từng từ một, và nó làm điều đó cho tất cả các từ, không chỉ cho 1 từ. Tôi đã tìm thấy nó ở đâu đó trên mạng quốc tế từ lâu, nhưng tôi không thể tìm thấy hoặc nhớ nó ..

Câu trả lời:


33

Tôi sẽ sử dụng trthay vì awk :

echo "Lorem ipsum dolor sit sit amet et cetera." | tr '[:space:]' '[\n*]' | grep -v "^\s*$" | sort | uniq -c | sort -bnr
  • tr chỉ thay thế không gian bằng dòng mới
  • grep -v "^\s*$" cắt ra các dòng trống
  • sort để chuẩn bị làm đầu vào cho uniq
  • uniq -c đếm số lần xuất hiện
  • sort -bnr sắp xếp theo thứ tự ngược số trong khi bỏ qua khoảng trắng

ồ hóa ra đó là một mệnh lệnh tuyệt vời để đếm lời thề

tìm thấy . -name "* .py" -exec mèo {} \; | tr '[: dấu cách:]' '[\ n *]' | grep -v "^ \ s * $" | sắp xếp | uniq -c | sắp xếp -bnr | grep chết tiệt


Có thể muốn sử dụng tr -sđể xử lý nhiều không gian, đặc biệt là khi gặp phải vết lõm.
Bắt đầu

@Arcege: Điểm tốt. Mặc dù nó không thay đổi kết quả, nhưng nó có thể làm nhanh kịch bản một chút.
chọn

-g( --general-numeric-sort) tùy chọn sortcó thể thích hợp hơn trong một số trường hợp. Ví dụ, sort -nsẽ giữ nguyên trạng 10\n1 4, đối xử 1 4như 14, trong khi sort -gsẽ đối xử chính xác như 1 4\n10.
Skippy le Grand Gourou

lệnh tốt, thực sự xứng đáng để bỏ phiếu :)
Noor

@seler Tôi nghĩ bạn có thể làm cho phần grep và tr thậm chí đơn giản hơn như dưới đây: echo "Lorem ipsum dolor sit sit amet et cetera." | tr ' ' '\n' | grep -v "^$" | sort | uniq -c | sort -bnrLưu ý rằng tôi là người mới bắt đầu, vì vậy tôi có thể sai, xin vui lòng tư vấn.
smc

8
  1. Chia đầu vào thành các từ, mỗi dòng trên một dòng.
  2. Sắp xếp danh sách kết quả của các từ (dòng).
  3. Bóp nhiều lần xuất hiện.
  4. Sắp xếp theo số lần xuất hiện.

Để phân chia đầu vào thành các từ, thay thế bất kỳ ký tự nào bạn cho là dấu tách từ bằng một dòng mới.

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

Đây là một câu trả lời hay vì nó có thể xử lý trường hợp các từ được đặt trực tiếp bên cạnh một số dấu câu không phải từ mà bạn muốn bỏ qua.
David Grayson

5

Không sử dụng grep và awk nhưng điều này dường như làm những gì bạn muốn:

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
Điều này sẽ không hoạt động nếu đầu vào chứa các ký tự đại diện (bạn cần thêm set -f) và coi dấu câu là một phần của từ (có thể được sửa một cách lúng túng bằng cách thêm các ký tự dấu chấm câu vào IFS- chúc may mắn cố gắng hỗ trợ các bộ ký tự không phải ASCII). Điều này sẽ không tốt với các tệp đầu vào rất lớn, vì nó lưu toàn bộ tệp trong bộ nhớ ( sortthông minh hơn).
Gilles 'SO- ngừng trở nên xấu xa'

2

Tôi tin rằng bạn sau khi một cái gì đó như thế này?

$ 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

tất nhiên bạn cũng có thể làm awknhư vậy :)


2

Sử dụng awk/sort/uniqgiải pháp:

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

Đẹp! Điều này làm việc hoàn hảo.
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 

sắp xếp tăng dần sau khi chia tập tin thành các từ.

Các grep đơn giản sẽ tìm thấy fishtrong fisheye, vì vậy bạn phải tăng cường các lệnh grep để ngăn chặn trận đấu một phần.

Mất khoảng 3 giây cho tệp văn bản 25k trên máy ở độ tuổi, ổ cứng cổ điển (IDE).

Đối với các tệp lớn hơn hoặc thường được thực hiện, cách tiếp cận bản đồ băm sẽ tốt hơn, nhưng đối với một công việc hiếm khi chạy hoặc chỉ các tệp nhỏ hơn, nó có thể là đủ.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.