Мне нужно было преобразовать ipfilter.dat в стиле uTorrent в файл ipfilter в стиле bluetack, и я написал этот сценарий оболочки для достижения этой цели:
#!/bin/bash
# read ipfilter.dat-formatted file line by line
# (example: 000.000.000.000-008.008.003.255,000,Badnet
# - ***here, input file's lines/fields are always the same length***)
# and convert into a bluetack.co.uk-formatted output
# (example: Badnet:0.0.0.0-8.8.3.255
# - fields moved around, leading zeros removed)
while read record
do
start=`echo ${record:0:15} | awk -F '.' '{for(i=1;i<=NF;i++)$i=$i+0;}1' OFS='.'`
end=`echo ${record:16:15} | awk -F '.' '{for(i=1;i<=NF;i++)$i=$i+0;}1' OFS='.'`
echo ${record:36:7}:${start}-${end}
done < $1
Однако для входного файла из 2000 строквыполнение этого скрипта занимает в среднем 10 (!) секунд - всего 200 строк / сек.
Я уверен, что такого же результата можно добиться с помощью sed, а sed-версия, вероятно, будет намного быстрее.
Есть ли вокруг себя сед-гуру, чтобы предложить решение для такого рода замен фиксированных позиций?
Не стесняйтесь предлагать решение и на других языках - я бы с удовольствием протестировал Pythonили версия C, например.Также будет приветствоваться более эффективная версия оболочки / bash.