- оставить только начальное и конечное значение, Andrey Mitrofanov, 14:19 , 06-Июн-11 (1)
> Чтобы точнее сформулировать задачу, приведу конечный результат, который хотелось бы получить: > 902 2700000 2769999 > 902 2780000 2799999 > 903 2810000 2829999 $ awk 'function f(){if(a!="")print a" "b" "c;a=$1;b=$2;c=$3}{if(a!=""&&$1==a&&$2==c+1)c=$3;else f()}END{f()}' <data 902 2700000 2769999 902 2780000 2799999 903 2810000 2829999 $ _ Как я могу получить сои деньги?
- оставить только начальное и конечное значение, rec, 15:36 , 06-Июн-11 (2)
> Как я могу получить сои деньги? Спасибо за красивое решение задачи, работает. Думаю, не корысти ради помогаете в таких вот вопросах. :)
- оставить только начальное и конечное значение, sm00th1980, 15:37 , 06-Июн-11 (3)
как мне кажется в лоб такая задача в 2-3 строки не решается(типа хитрым регекспом). Тут нужно попытаться объеденить несколько диапазонов в один - по возможности. Т.е. как минимум где-то хранить диапазоны - и по полному списку пытаться понять есть ли продолжение текущего диапазона или нет.А какой язык то предполагается? хотя конечно могу ошибаться. PS вариант через рекурсию - зачётный :)
- оставить только начальное и конечное значение, rec, 15:48 , 06-Июн-11 (4)
> как мне кажется в лоб такая задача в 2-3 строки не решается > А какой язык то предполагается?тоже склонялся к такому варианту. Не ожидал однострочного решения.
- оставить только начальное и конечное значение, Andrey Mitrofanov, 16:07 , 06-Июн-11 (5)
> PS вариант через рекурсию - зачётный :) :-О Где-е-е??
- оставить только начальное и конечное значение, sm00th1980, 16:28 , 06-Июн-11 (6)
>> PS вариант через рекурсию - зачётный :) > :-О Где-е-е??function f(){if(a!="")print a" "b" "c;a=$1;b=$2;c=$3}{if(a!=""&&$1==a&&$2==c+1)c=$3;else f()}END{f()} может я конечно что-то не так понял... но вроде как f() предпоследний - это вызов саму себя - я прав или нет? трудно просто без форматирования возможно понять :)
- оставить только начальное и конечное значение, Andrey Mitrofanov, 17:33 , 06-Июн-11 (8)
> может я конечно что-то не так понял... но вроде как f() предпоследний > - это вызов саму себя - я прав или нет?Нет, это не рекурсия ни разу. Посто оформление одного куска кода, используемого в двух местах, в виде функции.
- оставить только начальное и конечное значение, Aquarius, 16:57 , 06-Июн-11 (7)
>[оверквотинг удален] > Чтобы точнее сформулировать задачу, приведу конечный результат, который хотелось бы получить: > 902 2700000 2769999 > 902 2780000 2799999 > 903 2810000 2829999 > Т.е. диапазон нумерации в отдельных строках является продолжением нумерации предыдущей > строки. Хотелось бы иметь только начальное и конечное значение приведенных диапазонов > и те, которые являются продолжением диапазона из предыдущей строки объединить в > один диапазон. > Реально скрипт такой сочинить? Не подкините идеи? > Можно для начала упростить задачу: убрать первый столбец (902, 903).я бы посоветовал сначала преобразовать в префиксную нотацию, а потом, если требуется, обратно; то есть, то что получися, будет списком начал номеров, таких, что если номер начинается с этих цифр, он входит в диапазон к примеру, для вашего списка получится 902270 902271 902272 902273 902274 902275 902276 902278 902279 903281 903282 у вас пример данных не универсален, решив задачу на этих номерах, вы можете столкнуться с проблемами с другими, более раздробленными диапазонами, к примеру 902 2700000 2703999 из которого получается такой список префиксов: 9022700 9022701 9022702 9022703 то есть, в общем случае, получается не одна строка список префиксов сортируется и анализируется на покрывающие префиксы (диапазон, где весь префикс повторяется кроме последней цифры, на месте которой есть все от 0 до 9, заменяется одним префиксом без этой последней цифры) список префиксов вернуть к исходному формату - плевое дело - дописать недостающее количество нулей для начала и девяток для конца диапазона P.S. "для начала" надо не убирать первый столбец, а "приклеить" его ко второму и третьему
- оставить только начальное и конечное значение, rec, 08:35 , 07-Июн-11 (9)
>[оверквотинг удален] > у вас пример данных не универсален, решив задачу на этих номерах, вы > можете столкнуться с проблемами с другими, более раздробленными диапазонами > то есть, в общем случае, получается не одна строка > список префиксов сортируется и анализируется на покрывающие префиксы (диапазон, где весь > префикс повторяется кроме последней цифры, на месте которой есть все от > 0 до 9, заменяется одним префиксом без этой последней цифры) > список префиксов вернуть к исходному формату - плевое дело - дописать недостающее > количество нулей для начала и девяток для конца диапазона > P.S. "для начала" надо не убирать первый столбец, а "приклеить" его ко > второму и третьему открывая тему, старался максимально упростить задачу, было желание получить определенный результат и убедиться в возможности таких преобразований юниксовскими командами (не сомневаюсь в возможностях программистов сделать это более рационально с помощью соответствующих языков программирования, коими я, к сожалению, не владею). Ваше замечание о другом дроблении префиксов (и оно имеет место быть) очень своевременно, обращу на это внимание. Конечная задача конечно же намного сложнее и запутаннее. Спасибо за ваш совет по использованию полного 10-ти значного префикса, источник перечислил их (префиксы) в удобной для себя форме. Для работы удобнее будет объединить цифры первого столбца со вторым и третьим.
|