Почему это управляло, помещает пробел вначале?

У меня есть этот код в сценарии оболочки:

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

Входной файл не имел никаких предыдущих пробелов, но вывод делает. Как я фиксирую это? Это находится в ударе

10
задан 28 October 2018 в 08:54

4 ответа

Поведение по умолчанию uniq состоит в том, чтобы исправиться - выравнивают по ширине частоту в строке 7 широких пробелов, затем разделяют частоту от объекта с одиночным пробелом.

Источник: https://www.thelinuxrain.com/articles/tweaking-uniq-c

Удалите ведущие пробелы с sed:

$ sort input | uniq -c | sort -nr | sed 's/^\s*//' > output
12
ответ дан 23 November 2019 в 04:23

uniq -c добавляет ведущий пробел. Например.

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

Вы могли добавить команду в конце конвейера для удаления его. Например.

$ echo test | uniq -c | sed 's/^\s*//'
1 test
5
ответ дан 23 November 2019 в 04:23

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
1
ответ дан 23 November 2019 в 04:23
uniq -c -i | tr -s ' ' | cut -c 2-

Преобразуйте начальные пробелы в один пробел с помощью tr -s, а затем напечатайте вывод из 2-го символа с помощью cut -c.

0
ответ дан 7 March 2020 в 07:15

Другие вопросы по тегам:

Похожие вопросы: