откройте терминал и в командной строке введите
du -sk * | sort -n
. Это даст вам список самых больших файлов или папок в порядке размера, причем самый большой внизу. Если папка особенно велика, cd в нее и повторите процесс.
В сценарии python:
#!/usr/bin/env python3
import sys
f = sys.argv[1]; out = sys.argv[2]
n = 0
with open(out, "wt") as wr:
with open(f) as read:
for l in read:
n = n + int(l); wr.write(str(n)+"\n")
python3 /path/to/add_last.py <input_file> <output_file>
Код довольно читабельен, но подробно:
Скопируйте сценарий в пустой файл, сохраните его как add_last.py Откройте файл ввода для чтения в строкеwith open(f) as read:
for l in read:
Запустите его с исходным файлом и целевым выходным файлом в качестве аргументов: python3 /path/to/add_last.py <input_file> <output_file>
Запустите его с помощью исходный файл и целевой файл вывода в качестве аргументов:
wr.write(str(n)+"\n")
$ sed 'a+p' file | dc -e0 -
3
7
12
20
Это работает путем добавления +p для каждой строки ввода, а затем передать результат в dc калькулятор где [ ! d2]
+ Pops two values off the stack, adds them, and pushes the result.
The precision of the result is determined only by the values of
the arguments, and is enough to be exact.
, то
p Prints the value on the top of the stack, without altering the
stack. A newline is printed after the value.
[F6] аргумент толкает 0 на dc стек инициализировать сумму.
В Bash:
#! /bin/bash
file="YOUR_FILE.txt"
TOTAL=0
while IFS= read -r line
do
TOTAL=$(( TOTAL + line ))
echo $TOTAL
done <"$file"
Чтобы напечатать частичные суммы целых чисел, заданные на стандартном входе один на строку:
#!/usr/bin/env python3
import sys
partial_sum = 0
for n in map(int, sys.stdin):
partial_sum += n
print(partial_sum)
Пример запуска.
Если по какой-то причине команда слишком медленная; вы можете использовать программу C:
#include <stdint.h>
#include <ctype.h>
#include <stdio.h>
int main(void)
{
uintmax_t cumsum = 0, n = 0;
for (int c = EOF; (c = getchar()) != EOF; ) {
if (isdigit(c))
n = n * 10 + (c - '0');
else if (n) { // complete number
cumsum += n;
printf("%ju\n", cumsum);
n = 0;
}
}
if (n)
printf("%ju\n", cumsum + n);
return feof(stdin) ? 0 : 1;
}
Чтобы создать и запустить, введите:
$ cc cumsum.c -o cumsum
$ ./cumsum < input > output
UINTMAX_MAX is 18446744073709551615.
Код C в несколько раз быстрее, чем команда awk на моей машине для входного файла, сгенерированного с помощью:
#!/usr/bin/env python3
import numpy.random
print(*numpy.random.random_integers(100, size=2000000), sep='\n')
Вероятно, вы хотите что-то вроде этого:
sort -n <filename> | uniq -c | awk 'BEGIN{print "Number\tFrequency"}{print $2"\t"$1}'
Объяснение команды:
sort -n <filename> | uniq -c сортирует вход и возвращает частотную таблицу | awk 'BEGIN{print "Number\tFrequency"}{print $2"\t"$1}', превращает вывод в более удобный ФорматПример: Входной файл list.txt:
4
5
3
4
4
2
3
4
5
Команда:
$ sort -n list.txt | uniq -c | awk 'BEGIN{print "Number\tFrequency"}{print $2"\t"$1}'
Number Frequency
2 1
3 2
4 4
5 2
Вы можете сделать это в vim. Откройте файл и введите следующие нажатия клавиш:
qaqqayiwj@"<C-a>@aq@a:wq<cr>
Обратите внимание, что <C-a> на самом деле ctrl-a, а <cr> - возврат каретки, то есть кнопка ввода.
Вот как это работает. Во-первых, мы хотим очистить регистр «а», чтобы он не имел побочных эффектов в первый раз. Это просто qaq. Затем мы делаем следующее:
qa " Start recording keystrokes into register 'a'
yiw " Yank this current number
j " Move down one line. This will break the loop on the last line
@" " Run the number we yanked as if it was typed, and then
<C-a> " increment the number under the cursor *n* times
@a " Call macro 'a'. While recording this will do nothing
q " Stop recording
@a " Call macro 'a', which will call itself creating a loop
После выполнения этого рекурсивного макроса мы просто вызываем :wq<cr> для сохранения и выхода.
Perl one-liner:
$ perl -lne 'print $sum+=$_' input.txt
3
7
12
20
С 2,5 миллионами строк чисел требуется обработать 6,6 секунды:
$ time perl -lne 'print $sum+=$_' large_input.txt > output.txt
0m06.64s real 0m05.42s user 0m00.09s system
$ wc -l large_input.txt
2500000 large_input.txt
Простой однострочный Bash:
x=0 ; while read n ; do x=$((x+n)) ; echo $x ; done < INPUT_FILE
x - суммарная сумма всех чисел из текущей строки и выше. n - это число в текущей строке.
Мы перебираем все строки n из INPUT_FILE и добавляем их числовое значение к нашей переменной x и печатаем эту сумму во время каждой итерации.
Bash здесь немного медленнее, вы можете ожидать, что это заработает около 20-30 секунд для файла с 2 миллионами записей, без печати вывода на консоль (что еще медленнее, независимо от способ вы используете).
Как и при ответе @ steeldriver, но с немного менее загадочным bc вместо этого:
sed 's/.*/a+=&;a/' input | bc
Самое приятное в bc (и dc) заключается в том, что они являются произвольными калькуляторами точности , поэтому никогда не будет переполняться или испытывать недостаток точности над целыми числами.
Выражение sed преобразует вход в:
a+=3;a
a+=4;a
a+=5;a
a+=8;a
. Затем это оценивается с помощью bc. Параметр a bc автоматически инициализируется до 0. Каждая строка увеличивает a, затем явно печатает его.