2012-01-29 27 views
7

Tôi đã đọc sách dạy nấu ăn cho Linux để tìm hiểu về nó. Tôi khá mới với nó.Sự hợp nhất của văn bản

Tôi cam kết một chủ đề có tên là Văn bản trùng lặp. Bây giờ tôi hiểu nó là gì, nhưng tôi không thể có được một chuỗi các lệnh bằng cách sử dụng tr, sort và uniq (Đó là những gì mà sách dạy nấu ăn nói) sẽ tạo ra sự phù hợp.

Ai đó có thể cho tôi biết cách tạo sự phù hợp cơ bản không? tức là chỉ sắp xếp và hiển thị tần suất từ ​​cho từng từ duy nhất.

Ý tưởng được trình bày trong sách dạy nấu ăn để sử dụng tr để dịch tất cả dấu cách sang ký tự dòng mới sao cho mỗi từ đi vào một dòng mới, sau đó được chuyển đến bộ sắp xếp và sau đó chuyển đến uniq bằng cờ -c thực hiện một số các thuật ngữ duy nhất.

Tôi không thể tìm ra thông số chính xác. Ai đó có thể giải thích xin vui lòng trong khi giải thích những gì mỗi tham số không?

Tôi đã googled ra cho điều này nhưng tôi không thể có được một câu trả lời rõ ràng cho vấn đề của tôi.

Bất kỳ trợ giúp nào được đánh giá cao!

Trả lời

0
tr ' ' '\n' <input | sort | uniq -c 

Nếu tôi hiểu nhận xét của bạn đúng, bạn muốn tổng tất cả các từ trên tất cả các tệp trong một thư mục. Bạn có thể làm điều đó như thế này:

find mydir -type f -exec cat {} + | tr ' ' '\n' | sort | uniq -c 

find sẽ đệ quy tìm kiếm mydir cho các tập tin phù hợp với đối số của nó: -type f nói với nó để chỉ giữ các tập tin bình thường (như trái ngược với các thư mục hoặc một vài loại khác mà bạn không cần phải lo lắng về việc này), sau đó find sẽ thực hiện cat, cấp cho nó tất cả tên tệp làm đối số; cat ghép các tệp, in tất cả nội dung của chúng như thể đó là một tệp lớn. Kết quả đầu ra đó đi qua cùng một đường dẫn tr/sort/uniq để thực sự tính toán sự phù hợp.

+0

Tôi phải chạy ngay bây giờ (theo nghĩa đen) nhưng tôi sẽ giải thích khi tôi quay lại nếu không có ai khác làm. Trong khi đó, đọc các trang của người đàn ông. – Kevin

+0

Cảm ơn rất nhiều. Điều đó hoạt động. Tôi sẽ cố gắng để de-xây dựng và hiểu nó. –

+0

OK. Tôi đạt được rồi. Tuy nhiên, một câu hỏi, chúng ta có thể mở rộng điều này để làm cho một sự phù hợp của một số tập tin trong một thư mục duy nhất? Một cách, để đi về điều này là để lưu trữ đầu ra của "ls" trong một tập tin và sau đó cho mỗi dòng của tập tin đó là một tên tập tin, chạy lệnh trên để nối thêm sự phù hợp của tập tin đó trong "kết quả". Sau đó, làm một sự phù hợp trên "kết quả" một lần nữa. Điều này đang làm việc nhưng, có một cách đơn giản, thanh lịch để thực hiện việc này? –

1

Có nhiều cách để thực hiện việc này, nhưng đây là giải pháp của tôi. Nó sử dụng các lệnh khác nhau hơn bạn đề cập, nhưng, thông qua việc sử dụng sed và một `sắp xếp cuối cùng, nó có thể tạo ra nhiều đầu ra mong muốn hơn.

find . -type f -print0 | xargs -0 cat | sed 's/[[:punct:]]//g' | sed -r 's/\s+/\n/g' | sort | uniq -c | sort -n 

find . -type f -print0 sẽ đệ quy tìm kiếm tất cả các thư mục và tệp từ thư mục hiện tại của bạn xuống dưới. -type f sẽ chỉ trả về các tệp. -print0 sẽ sử dụng ký tự đặc biệt \0 để kết thúc tên tệp sao cho không gian không gây nhầm lẫn cho lệnh tiếp theo trong đường ống.

xargs lấy đầu vào và biến thành đối số cho lệnh, trong trường hợp này là cat. cat sẽ in nội dung của tất cả các tệp được đặt cho nó dưới dạng đối số. Các -0 nói với xargs rằng đầu vào của nó được giới hạn bởi các ký tự đặc biệt \0, không phải bởi dấu cách.

sed là trình chỉnh sửa luồng phù hợp với mẫu. sed lệnh con đầu tiên (s) tất cả các dấu chấm câu bằng cách sử dụng mẫu [[:punct:]] và thay thế dấu chấm câu bằng không có gì. Nó khớp với tất cả các mẫu như vậy trong mỗi dòng cho nó (g).

Lệnh sed thứ hai chuyển tất cả các trường hợp 1 hoặc nhiều dấu cách liên tiếp (\s+) thành dòng mới (\n) thông qua chuỗi đầu vào (g).

sort tổ chức các từ theo thứ tự abc.

uniq -c loại bỏ các bản sao lân cận trong danh sách đầu ra trong khi đếm số lượng đã có.

sort -n sắp xếp kết quả này theo số lượng cho một danh sách các từ được sắp xếp theo tần suất từ.

sedxargs là các lệnh rất mạnh, đặc biệt nếu được sử dụng kết hợp. Nhưng, như một áp phích khác đã ghi nhận, find cũng có sức mạnh gần như không kiềm chế. tr hữu ích, nhưng cụ thể hơn sed.

+0

Điều này thật tuyệt! Cảm ơn bạn đã cải thiện chức năng (qua câu trả lời khác). –

Các vấn đề liên quan