У меня есть этот код в сценарии оболочки:
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 вы можете использовать другой инструмент сортировки для большей гибкости. 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, а затем выведите выходные данные второго символа с помощью cut -c.