Почему команда 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 пробелов, иначе "чуть меньше табуляции".
Хрилис - на забастовке -

Затем вы можете разделить вкладки с чем-то вроде 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 вы можете использовать другой инструмент сортировки для большей гибкости. 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

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

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


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