Чому команда uniq -c поставила пробіл на початку?


11

Я маю цей код у сценарії оболонки:

sort input | uniq -c | sort -nr > output

У вхідному файлі не було попередніх пробілів, але вихідний. Як це виправити? Це в басі

Відповіді:


13

Поведінка uniq за замовчуванням полягає в правильному обґрунтуванні частоти в рядку 7 проміжків, а потім відокремленні частоти від елемента одним пробілом.

Джерело: https://www.thelinuxrain.com/articles/tweaking-uniq-c

Видаліть провідні місця з sed:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output

2
7 пробілів, він же "трохи менше вкладки".
chrylis

Потім можна розділити вкладки з чимось подібним perl -pe 's/ *(\d+) /$1\t/'( тут є деякі варіанти ). Також передайте в буфер обміну, xclip -selection cщоб вставити його безпосередньо в електронну таблицю.
Пабло Біанкі

5

uniq -cдодає провідний пробіл. Напр

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

Ви можете додати команду в кінці конвеєра, щоб видалити її. Напр

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

1

Для більшої гнучкості FWIW ви можете використовувати інший інструмент для сортування. Пітон є одним із таких інструментів.

Джерело

#!/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)

Теоретично це було б навіть швидше, ніж sortінструмент для великих входів, оскільки вищевказана програма використовує хеш-таблицю для ідентифікації повторюваних рядків замість відсортованого списку. (На жаль, він розміщує рядки з однаковим підрахунком у довільному, а не в природному порядку; це може бути змінено та все ж швидше, ніж два sortвиклики.)

Формат виводу

Якщо ви хочете більше гнучкості формату виведення ви можете дивитися в print()і format()вбудовані функції.

Наприклад, якщо ви хочете роздрукувати число рахунку в восьмигранні з до 7 провідних нулів, а за ним вкладку замість символу пробілу з термінатором рядка NUL, замініть останній рядок на:

    print(format(count, '08o'), item, sep='\t', end='\0')

Використання

Зберігайте сценарій у файлі, скажімо sort_count.py, і викликайте його за допомогою Python:

python3 sort_count.py < input

0
uniq -c -i | tr -s ' ' | cut -c 2-

Перекладіть провідні пробіли в єдиний пробіл з tr-та, а потім надрукуйте вихід другого символу з допомогою cut -c.


Ваше рішення видавить усі випадки послідовності пробілів. Це бажаний ефект.
Марк Ванхуміссен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.