доброго времени суток.
имеется некий файл, подобного содержания:
.... строка
.... строка
A;B;C;D;E;F;G;H;xyz;ii;led;;
;;;;;;G;H;zzz;aa;b;;....
.... строка
подобные строки:
A;B;C;D;E;F;G;H;xyz;ii;led;;
;;;;;;G;H;zzz;aa;b;;
всегда идут в паре в таком же порядке.
нужно, чтобы при появлении таких "пар" строк, происходило заполнение пустых "контейнеров" заключенных в ";" во второй строке.
к примеру G и H это одинаковые переменные в обоих строках соответственно, а все, что идет после них (вправо) это уникальные значения.
нужно из "первой" строки выдернуть А, B, C, D, E, F и поместить во "вторую".
то есть должно получиться вот так:
A;B;C;D;E;F;G;H;xyz;ii;led;;
A;B;C;D;E;F;G;H;zzz;aa;b;;
такие строки всегда идут в паре (две строки)
и встречаются нередко в одном большом файле.
все строки уникальные.
что то я потерялся над задачей.
может отдельную функцию какую то нужно писать?
Есть идеи?
снова о строках
[console]$ echo "A;G;H;xyz;ii;led;;
;G;H;zzz;aa;b;;"| sed -r 'N;s/(.*);(G;)(.*\n)(;)(G;.*)/\1;\2\3\1\4\5/'
A;G;H;xyz;ii;led;;
A;G;H;zzz;aa;b;;
[/console]
дальше сами сообразите? Если нет -- ко мне на сервер ( http://emulek.tk/sed/index.html ) который сейчас почему-то опять не работает (:
чтобы сообразить - нужно для начала понять.
я что то вообще не понял.
и сервер Ваш не работает
gu@moshell:~$ echo "A;G;H;xyz;ii;led;;;G;H;zzz;aa;b;;"| sed -r 'N;s/(.*);(G;)(.*\n)(;)(G;.*)/\1;\2\3\1\4\5/'
A;G;H;xyz;ii;led;;;G;H;zzz;aa;b;;
что тут делает sed? найди семь отличий?
в общем я так думаю нужно заморочиться с perl
загнать текст в двумерный массив, где первый элемент будет номер строки, а второй элемент это сама строка.
далее цикл проходит по массиву, если n строка начинается с regexp, то строке n присвоить первые несколько элементов из строки n-1.
что тут делает sed? найди семь отличий?
вытаскивает ваш шаблон, и подставляет на нужное место ваше значение.
sed -r 'N;s/(.*);(G;)(.*\n)(;)(G;.*)/\1;\2\3\1\4\5/значение (A) это \1.
в общем я так думаю нужно заморочиться с perl
в думете, в perl какая-то другая команда s? Да почти такая же, только намного более страшная.
загнать текст в двумерный массив, где первый элемент будет номер строки, а второй элемент это сама строка.
для этого достаточно буфера из двух строк (у меня команда N готовит этот буфер). Для перехода к сл. строке, добавляем её в конец(N), и стираем позапрошлую(D). А вы что, хотите ВСЕ строки хранить? Ну дело ваше, память -- тоже не моя.
А что сервер не работает, так то наверное опять бомжи оптику на медь порезали. У нас такое бывает :(
Спасибо Док.
согласен что рациональнее использовать sed и буферизовать две строки.
ps. когда оптику починят?
можно хоть php. Там тоже есть PCRE и preg_replace. ЯП не имеет значения. На sed оно дёшево и сердито.согласен что рациональнее использовать sed и буферизовать две строки.
когда оптику починят?
не знаю... Надо пойти глянуть, но лень...
Когда то делал дамп этого сайта с последующим просмотром на компьютере, отсутствует только краткий учебник по sed. С не совсем кратким учебником все в норме.
Если доктор не против могу выложить на zalil.ru архив, а ссылку прикрепить здесь в теме.
я не против, но думаю потом можно просто на народе выложить. Мне всё никак не сподобится...
ormorph, да, лучше яндекс или гугл. Этот ваш "залил" варезом отдаёт, там с доступностью ещё хуже будет, чем у меня. Т.е. я-то лично ничего против не имею, но вот всякие карательные органы могут скопом забанить.
ormorph, и да, я ПРОТИВ, если у вас старая версия с кучей ошибок. Я эту ерунду писал несколько лет урывками, и первые версии полны жутких ошибок. А последние -- более-менее. Даже орфографию местами поправил :[
Доктор, что плохого в том, что твое творение будет лежать на разных "зеркалах", если там будет твоя копирайта?
sed очень гибкий и мощный потоковый редактор.
даешь sed народу!
Доктор, что плохого в том, что твое творение будет лежать на разных "зеркалах", если там будет твоя копирайта?
мне не слишком важен копирайт. Дело не в этом. Просто в сети полно старых копий с ошибками. Если-бы там была ссылка на источник... И если-бы источник не был-бы таким летучим голландцем как я...
Доктор, Вы же доктор, залечите ситуацию.
Док, помоги решить задачу, упростить код. а то что то я нагородил кучу всего в глазах рябит.
gu@moshell:~$ echo 'Fach;maxFach1Power;{ -350..150 };0.1 dB;1;18;18;;;;;;' | sed -e 's/^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);.*/\1/'
18
как нибудь можно упростить?
как ты уже догадался, мне нужно значение между 6й и 7й ";"
echo 'Fach;maxFach1Power;{ -350..150 };0.1 dB;1;18;18;;;;;;' | awk -F ";" '{print $6}'опа. я так понял решений мильен.
спасибо Альберто
/add. Вы имели в виду $7?
и кстати, разделителя в конце может и не быть. но все равно работает
gu@moshell:~$ echo 'Fach;maxFach1Power;{ -350..150 };0.1 dB;1;18;19' | awk -F ";" '{print $7}'
19
/add. Вы имели в виду $7?
Ну да, обсчитался :(
[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;
этот ужас эквивалентен
([^;]*;){6}конечно надо учесть, что дальше по коду твои ВТОРЫЕ (уже) скобки будут называться \2.
В данном случае я-бы дырки заполнял последовательно, типа вот так:
$ echo ";;;;;ABCD"| sed -r '
:l
s/(.*);;(.*)([^;])(.*)/\1;\3;\2\4/p
tl
'
;;;;D;ABC
;;;C;D;AB
;;B;C;D;A
;A;B;C;D;
;A;B;C;D;