Sắp xếp các tập tin theo nội dung dòng của Wikipedia Tần số - in trùng lặp


-1

Hãy tưởng tượng có một tập tin -

a
b
b
b
b
c
c
d
d
d

Tôi muốn đầu ra được sắp xếp dựa trên tần số (tôi cũng muốn in các dòng trùng lặp) -

b
b
b
b
d
d
d
c
c
a

Câu trả lời:


3

Sau đây sẽ thực hiện những gì bạn đang theo đuổi ... mặc dù có nhiều cách khác để đạt được điều này ... ví dụ như với gawk, theo câu trả lời của Kamil.

  • Đầu tiên sort sẽ sắp xếp dữ liệu theo dữ liệu dòng
  • uniq -c sẽ đếm số lần xuất hiện phù hợp (họ phải là hàng xóm)
  • sort -nr sẽ sắp xếp theo số lần xuất hiện, theo thứ tự ngược lại
  • Các while vòng lặp lặp trên mỗi dòng
    • read n l sẽ ăn số đếm vào nvà dữ liệu dòng vào l
  • Các for vòng lặp sẽ lặp lại n lần
  • echo "${l}" xuất dữ liệu dòng
(
    sort \
        | uniq -c \
        | sort -nr \
        | while read n l; do \
            for i in $(seq ${n}); do \
                echo "${l}"; \
            done; \
        done
) <<"EOF"
a
b
b
b
b
c
c
d
d
d
EOF

3

Với GNU Awk:

gawk '
   { arr[$0]++ }
   END {
        PROCINFO["sorted_in"] = "@val_num_desc"
        for (ln in arr) for (i = 1; i <= arr[ln]; i++) print ln
       }
   '

Bí quyết là sử dụng một mảng và @val_num_desc. Mỗi dòng gặp phải trở thành một chỉ mục, giá trị liên quan được tăng lên mỗi khi dòng xuất hiện. Cuối cùng, chúng tôi quét toàn bộ mảng theo thứ tự cụ thể:

"@val_num_desc"
[V]] các giá trị phần tử, được coi là số, được sắp xếp theo thứ tự từ cao đến thấp.

nguồn

Vì vậy, bên ngoài (đầu tiên) for chịu trách nhiệm truy xuất các dòng và tần số của chúng theo thứ tự mong muốn; bên trong (thứ hai) for chỉ để in dòng hiện được chọn đúng số lần.

Chú thích:

  • Mỗi nhân vật đều có vấn đề. Một dòng và cùng một dòng với một không gian dấu phụ là khác nhau.

PROCINFO["sorted_in"] - tuyệt vời, chỉ là những gì tôi đang tìm kiếm để làm cho một awk ví dụ quá, cảm ơn!
Attie

3
@Attie Tôi nghĩ rằng nó có thể không hoạt động ở đồng bằng awk, trừ khi bạn awkgawk trong ngụy trang. Trong Debian của tôi awk Trước đây quá hạn chế, tôi phải cài đặt gawk. Bây giờ cả hai lệnh đều hiểu điều này bởi vì awk là (không trực tiếp) được liên kết đến gawk.
Kamil Maciorowski
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.