Câu trả lời:
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.
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 while
vòng lặp lặp trên mỗi dòng read n l
sẽ ăn số đếm vào n
và dữ liệu dòng vào l
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
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.
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:
awk
, trừ khi bạn awk
Là gawk
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
.
PROCINFO["sorted_in"]
- tuyệt vời, chỉ là những gì tôi đang tìm kiếm để làm cho mộtawk
ví dụ quá, cảm ơn!