Tôi có mã này trong một kịch bản shell:
sort input | uniq -c | sort -nr > output
Các tập tin đầu vào không có khoảng trắng trước, nhưng đầu ra thì có. Làm thế nào để tôi sửa lỗi này? Đây là trong bash
Tôi có mã này trong một kịch bản shell:
sort input | uniq -c | sort -nr > output
Các tập tin đầu vào không có khoảng trắng trước, nhưng đầu ra thì có. Làm thế nào để tôi sửa lỗi này? Đây là trong bash
Câu trả lời:
Hành vi mặc định của uniq là xác định đúng tần số trong một dòng rộng 7 khoảng trắng, sau đó tách tần số khỏi mục với một khoảng trắng.
Nguồn: https://www.thelinuxrain.com/articles/tweaking-uniq-c
Loại bỏ các không gian hàng đầu với sed:
$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
FWIW bạn có thể sử dụng một công cụ sắp xếp khác để linh hoạt hơn. Python là một trong những công cụ như vậy.
#!/usr/bin/python3
import sys, operator, collections
counter = collections.Counter(map(operator.methodcaller('rstrip', '\n'), sys.stdin))
for item, count in counter.most_common():
print(count, item)
Về lý thuyết, điều này thậm chí sẽ nhanh hơn sort
công cụ cho các đầu vào lớn do chương trình trên sử dụng bảng băm để xác định các dòng trùng lặp thay vì danh sách được sắp xếp. (Than ôi, nó đặt các dòng có số lượng giống hệt nhau theo cách tùy ý thay vì theo thứ tự tự nhiên; điều này có thể được sửa đổi và vẫn nhanh hơn hai lần sort
gọi.)
Nếu bạn muốn linh hoạt hơn về định dạng đầu ra, bạn có thể xem xét các chức năng print()
và tích format()
hợp sẵn.
Chẳng hạn, nếu bạn muốn in số đếm theo số bát phân với tối đa 7 số 0 đứng đầu và theo sau là một tab thay vì ký tự khoảng trắng bằng dấu kết thúc dòng NUL, hãy thay thế dòng cuối cùng bằng:
print(format(count, '08o'), item, sep='\t', end='\0')
Lưu trữ tập lệnh trong một tệp, nói sort_count.py
và gọi nó bằng Python:
python3 sort_count.py < input
uniq -c -i | tr -s ' ' | cut -c 2-
Dịch các khoảng trắng hàng đầu thành các khoảng trắng đơn với tr -s và sau đó in đầu ra từ ký tự thứ 2 bằng cut -c.