у нас есть некоторые данные, такие как:
12 0
13 0
20 0
25 1
64 4
77 1
89 100
1201 204
Я хотел бы получить этот вывод:
3 0
5 1
6 4
7 100
8 204
объяснение: у нас есть 3 AS (автономные системы), которые имеют степень 0, а затем у нас есть 5 AS, у которых степень равна 1 или меньше 1, и у нас есть 6 AS, у которых степень составляет 4 или меньше 4 и ...
Я думаю, что есть много строк (100 000), это CDF дистрибутивов, это часть парсинга данных bgpdump, и я хочу вычислить эти числа. И снова tnx для вашей помощи
Ответы:
Вот быстрый Perl-скрипт, который должен сделать всю работу за вас:
Этот сценарий потребует значительной памяти для больших входных наборов данных; он обрабатывает весь входной файл перед тем, как с ним работать, поскольку он не выглядит так, как будто входной файл отсортирован, и перед операцией необходимо отсортировать данные по степени. Тем не менее, это должно сделать работу для вас довольно хорошо - дайте мне знать, если это не так!
источник
Вот быстрый 100% скрипт bash, который сделает эту работу:
Если вам нужен скрипт, который вы можете вызвать из командной строки:
Или, если вы предпочитаете однострочку, чтобы произвести впечатление на вашу бабушку:
Он работает примерно за 2-3 секунды на двухъядерном процессоре Pentium с частотой 2,6 ГГц в файле с 100000 строк.
редактировать
Пояснения:
Первый цикл:
a
чтобы быть пустым массивом:a=()
datafile.txt
построчно. В каждой строке два поля, только второе добавляется в имена переменныхn
n
не пусто (это тест,[[ -n $n ]]
мы увеличиваем значениеn
ключа -th массиваa
; это то, что((++a[n]))
делает строка .((...))
Это арифметический контекст bash.a
, иk
поле -th - это количество автономных систем, степень которых равнаk
.Тогда второй цикл:
c
устанавливается в 0.for i in ${!a[@]}; do
будет перебирать все ключи массиваa
.$((c+=a[i]))
добавит значениеa[i]
кc
и расширит это значение. Это значениеecho
редактируется сi
добавлением значения ключа .Надеюсь это поможет!
источник