У меня есть этот код в сценарии оболочки:
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
uniq -c
добавляет ведущий пробел. Например.
$ echo test
test
$ echo test | uniq -c
1 test
Вы могли добавить команду в конце конвейера для удаления его. Например.
$ echo test | uniq -c | sed 's/^\s*//'
1 test
FWIW можно использовать другой инструмент сортировки для большей гибкости. Python является одним таким инструментом.
#!/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 -s, а затем напечатайте вывод из 2-го символа с помощью cut -c.