LinuxForum.Fans
Тема

снова о строках

Автор: moshell 20 сообщений 4670 просмотров
#340527

доброго времени суток.


имеется некий файл, подобного содержания:
.... строка
.... строка
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;;

такие строки всегда идут в паре (две строки)
и встречаются нередко в одном большом файле.

все строки уникальные.

что то я потерялся над задачей.
может отдельную функцию какую то нужно писать?
Есть идеи?

#340534

[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 ) который сейчас почему-то опять не работает (:

#340543

чтобы сообразить - нужно для начала понять.
я что то вообще не понял.
и сервер Ваш не работает

#340544

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? найди семь отличий?

#340548

в общем я так думаю нужно заморочиться с perl

загнать текст в двумерный массив, где первый элемент будет номер строки, а второй элемент это сама строка.
далее цикл проходит по массиву, если n строка начинается с regexp, то строке n присвоить первые несколько элементов из строки n-1.

#340550
"moshell" написал:
что тут делает sed? найди семь отличий?

вытаскивает ваш шаблон, и подставляет на нужное место ваше значение.

text
sed -r 'N;s/(.*);(G;)(.*\n)(;)(G;.*)/\1;\2\3\1\4\5/

значение (A) это \1.

"moshell" написал:
в общем я так думаю нужно заморочиться с perl

в думете, в perl какая-то другая команда s? Да почти такая же, только намного более страшная.

"moshell" написал:
загнать текст в двумерный массив, где первый элемент будет номер строки, а второй элемент это сама строка.

для этого достаточно буфера из двух строк (у меня команда N готовит этот буфер). Для перехода к сл. строке, добавляем её в конец(N), и стираем позапрошлую(D). А вы что, хотите ВСЕ строки хранить? Ну дело ваше, память -- тоже не моя.

А что сервер не работает, так то наверное опять бомжи оптику на медь порезали. У нас такое бывает :(

#340563

Спасибо Док.
согласен что рациональнее использовать sed и буферизовать две строки.

ps. когда оптику починят?

#340575
"moshell" написал:
согласен что рациональнее использовать sed и буферизовать две строки.
можно хоть php. Там тоже есть PCRE и preg_replace. ЯП не имеет значения. На sed оно дёшево и сердито.

"moshell" написал:
когда оптику починят?

не знаю... Надо пойти глянуть, но лень...

#340600

Когда то делал дамп этого сайта с последующим просмотром на компьютере, отсутствует только краткий учебник по sed. С не совсем кратким учебником все в норме.

Если доктор не против могу выложить на zalil.ru архив, а ссылку прикрепить здесь в теме.

#340607

я не против, но думаю потом можно просто на народе выложить. Мне всё никак не сподобится...

ormorph, да, лучше яндекс или гугл. Этот ваш "залил" варезом отдаёт, там с доступностью ещё хуже будет, чем у меня. Т.е. я-то лично ничего против не имею, но вот всякие карательные органы могут скопом забанить.

#340608

ormorph, и да, я ПРОТИВ, если у вас старая версия с кучей ошибок. Я эту ерунду писал несколько лет урывками, и первые версии полны жутких ошибок. А последние -- более-менее. Даже орфографию местами поправил :[

#340611

Ну вот ссылка на архив тыц
Если там полно ошибок ни чего страшного, ссылка продержится не более 10 дней после последнего скачивания.
Вроде год стоит 2011

#340616

Доктор, что плохого в том, что твое творение будет лежать на разных "зеркалах", если там будет твоя копирайта?

sed очень гибкий и мощный потоковый редактор.
даешь sed народу!

#340643

учебник о sed

"moshell" написал:
Доктор, что плохого в том, что твое творение будет лежать на разных "зеркалах", если там будет твоя копирайта?

мне не слишком важен копирайт. Дело не в этом. Просто в сети полно старых копий с ошибками. Если-бы там была ссылка на источник... И если-бы источник не был-бы таким летучим голландцем как я...

#340647

Доктор, Вы же доктор, залечите ситуацию.

#340707

Док, помоги решить задачу, упростить код. а то что то я нагородил кучу всего в глазах рябит.

gu@moshell:~$ echo 'Fach;maxFach1Power;{ -350..150 };0.1 dB;1;18;18;;;;;;' | sed -e 's/^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);.*/\1/'
18

как нибудь можно упростить?
как ты уже догадался, мне нужно значение между 6й и 7й ";"

#340708
text
echo 'Fach;maxFach1Power;{ -350..150 };0.1 dB;1;18;18;;;;;;' | awk -F ";" '{print $6}'
#340710

опа. я так понял решений мильен.
спасибо Альберто


/add. Вы имели в виду $7?

и кстати, разделителя в конце может и не быть. но все равно работает
gu@moshell:~$ echo 'Fach;maxFach1Power;{ -350..150 };0.1 dB;1;18;19' | awk -F ";" '{print $7}'
19

#340712
"moshell" написал:
/add. Вы имели в виду $7?

Ну да, обсчитался :(

#340718
"moshell" написал:
[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;

этот ужас эквивалентен

text
([^;]*;){6}

конечно надо учесть, что дальше по коду твои ВТОРЫЕ (уже) скобки будут называться \2.

В данном случае я-бы дырки заполнял последовательно, типа вот так:

text
$ 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;
Войдите или зарегистрируйтесь, чтобы ответить.