Tại sao lệnh này đặt một khoảng trắng ở đầu?


10

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:


13

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

2
7 khoảng trắng, còn gọi là "chỉ ít hơn một tab".
chrylis -on đình công-

5

uniq -cthêm khoảng trắng hàng đầu. Ví dụ

$ echo test
test
$ echo test | uniq -c
      1 test

Bạn có thể thêm một lệnh ở cuối đường ống để loại bỏ nó. Ví dụ

$ echo test | uniq -c | sed 's/^\s*//'
1 test

1

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.

Nguồn

#!/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 sortcô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 sortgọi.)

Định dạng đầu ra

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')

Sử dụng

Lưu trữ tập lệnh trong một tệp, nói sort_count.pyvà gọi nó bằng Python:

python3 sort_count.py < input

0
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.


Giải pháp của bạn sẽ siết chặt tất cả các lần xuất hiện của trình tự khoảng trắng. Đây là hiệu quả mong muốn.
Marc Vanhoomissen
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.