Я маю цей код у сценарії оболонки:
sort input | uniq -c | sort -nr > output
У вхідному файлі не було попередніх пробілів, але вихідний. Як це виправити? Це в басі
Я маю цей код у сценарії оболонки:
sort input | uniq -c | sort -nr > output
У вхідному файлі не було попередніх пробілів, але вихідний. Як це виправити? Це в басі
Відповіді:
Поведінка uniq за замовчуванням полягає в правильному обґрунтуванні частоти в рядку 7 проміжків, а потім відокремленні частоти від елемента одним пробілом.
Джерело: https://www.thelinuxrain.com/articles/tweaking-uniq-c
Видаліть провідні місця з sed:
$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
perl -pe 's/ *(\d+) /$1\t/'
( тут є деякі варіанти ). Також передайте в буфер обміну, xclip -selection c
щоб вставити його безпосередньо в електронну таблицю.
Для більшої гнучкості 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
uniq -c -i | tr -s ' ' | cut -c 2-
Перекладіть провідні пробіли в єдиний пробіл з tr-та, а потім надрукуйте вихід другого символу з допомогою cut -c.