1 (01.10.2013 14:13:53 отредактировано moshell)

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


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

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

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

2

 Консоль:
$ 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;;

дальше сами сообразите? Если нет -- ко мне на сервер ( http://emulek.tk/sed/index.html ) который сейчас почему-то опять не работает (:

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

3

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

4

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

5

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

6

moshell пишет:

что тут делает sed? найди семь отличий?

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

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

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

moshell пишет:

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

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

moshell пишет:

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

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

7

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

8

moshell пишет:

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

можно хоть php. Там тоже есть PCRE и preg_replace. ЯП не имеет значения. На sed оно дёшево и сердито.

moshell пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

9

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

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

10

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

11

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

12 (01.10.2013 20:38:13 отредактировано ormorph)

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

13

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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

14

учебник о sed

moshell пишет:

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

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

Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)

15

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

16

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


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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

17

echo 'Fach;maxFach1Power;{ -350..150 };0.1 dB;1;18;18;;;;;;' | awk -F ";" '{print $6}'
Был, был и весь вышел...

18 (02.10.2013 11:56:57 отредактировано moshell)

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


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

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

"Фирма Майкрософт не собирается поддерживать протокол TCP/IP в своих OS" 1993 (c) Билл Гейтс
"Мы изобрели новый протокол передачи данных, мы назвали его TCP/IP" 1995 (c) Билл Гейтс

19

moshell пишет:

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

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

Был, был и весь вышел...

20 (02.10.2013 12:36:04 отредактировано drBatty)

moshell пишет:

[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;

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

([^;]*;){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;
Карусель разнесло по цепочке за час
Всех известий — конец
Да, весна началась!
(всё к лицу подлецу, как родному отцу, не рассказывай, батя, и так всё пройдёт)