У меня есть текстовый файл с 2 миллионами строк. Каждая строка имеет положительное целое число. Я пытаюсь сформировать таблицу частот.
Входной файл:
3
4
5
8
Вывод должен быть:
3
7
12
20
Как мне это сделать?
command-line
text-processing
Монти Хардер
источник
источник
Ответы:
С
awk
:$0
текущая строка Таким образом, для каждой строки я добавляю ее вtotal
, устанавливаю новую строкуtotal
, а затем трейлинг1
- это ярлык awk - он печатает текущую строку для каждого истинного условия и1
в качестве условия оценивается как истинное.источник
print
?print total}
вместо$0 = total}1
{print(total += $0)}
В скрипте Python:
Использовать
add_last.py
Запустите его с исходным файлом и целевым выходным файлом в качестве аргументов:
объяснение
Код довольно читабелен, но подробно:
Открыть выходной файл для записи результатов
Открыть входной файл для чтения в строке
Прочитайте строки, добавив значение новой строки к итогу:
Запишите результат в выходной файл:
источник
Просто для удовольствия
Это работает ppending к каждой строке ввода, а затем передать результат в калькулятор где
+p
dc
тогда
В
-e0
аргументе толчков0
наdc
стек для инициализации суммы.источник
real 0m4.234s
В Баш:
источник
real 0m53.116s
почти минуту, на 1,3 миллиона строк :)Чтобы напечатать частичные суммы целых чисел, заданные на стандартном вводе, по одному на строку:
Работоспособный пример .
Если по какой-то причине команда слишком медленная; Вы можете использовать программу на C:
Чтобы собрать его и запустить, введите:
Работоспособный пример .
UINTMAX_MAX
есть18446744073709551615
.Код C в несколько раз быстрее, чем команда awk на моем компьютере для входного файла, сгенерированного:
источник
accumulate()
itertoolВы, вероятно, хотите что-то вроде этого:
Объяснение команды:
sort -n <filename> | uniq -c
сортирует вход и возвращает таблицу частот| awk 'BEGIN{print "Number\tFrequency"}{print $2"\t"$1}'
превращает выход в более приятный форматПример:
входной файл
list.txt
:Команда:
источник
Вы можете сделать это в VIM. Откройте файл и введите следующие нажатия клавиш:
Обратите внимание , что
<C-a>
на самом деле Ctrl-A, и<cr>
является возврат каретки , т.е. на кнопку ввода.Вот как это работает. Прежде всего, мы хотим очистить регистр 'a', чтобы он не имел побочных эффектов в первый раз. Это просто
qaq
. Затем мы делаем следующее:После завершения работы этого рекурсивного макроса мы просто вызываем
:wq<cr>
команду save и завершаем работу.источник
Perl однострочный:
С 2,5 миллионами строк чисел обработка занимает около 6,6 секунд:
источник
real 0m0.908s
, довольно мило.Простой Bash с одним вкладышем:
x
сумма всех чисел из текущей строки и выше.n
это номер в текущей строке.Мы перебираем все линии
n
отINPUT_FILE
и добавить их числовое значение нашей переменнойx
и распечатать эту сумму во время каждой итерации.Bash здесь немного медленный, но вы можете ожидать, что он будет работать около 20-30 секунд для файла с 2 миллионами записей без вывода вывода на консоль (что даже медленнее, независимо от используемого вами метода).
источник
Похоже на ответ @ steeldriver, но
bc
вместо этого немного менее загадочно :Хорошая вещь о
bc
(иdc
) состоит в том, что они являются калькуляторами произвольной точности, поэтому никогда не будут переполнены или будут страдать от недостатка точности по сравнению с целыми числами.sed
Выражение преобразует входной сигнал в:Это тогда оценено
bc
.a
Переменная Ъс автоматически инициализируются в 0. Каждая строка с шагомa
, затем явно печатает его.источник
real 0m5.642s
на 1,3 миллиона строк. Сед очень медленно на этом.