The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от Андрей (??) on 10-Май-14, 18:31 
Здравствуйте.
Подскажите.

Например, есть текст примерно такого содержания:

------------------------
TABEL_ID;25235
CUSTOM_ID;3456436
PERSSEX;M
LASTNAME;Петров
FIRSTNAME;Василий
MIDDLENAME;Андреевич
TITLE;Руководитель
CONTACT_UNID;34636474575468586
PHONE_MOBILE;+456457567
EMAIL;petro@mail.ru
^
TABEL_ID;534636
CUSTOM_ID;4363467347
PERSSEX;M
LASTNAME;Васильев
FIRSTNAME;Игорь
MIDDLENAME;Петрович
TITLE;Менеджер
CONTACT_UNID;457677567658
PHONE_MOBILE;+456457567
EMAIL;vasya@mail.ru
^
--------------------------

Как в sed или аналогичной программе по разделителю ^ и ; транспонировать текст так, чтобы на выходе было:

TABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL
25235;3456436;M;Петров;Василий;Андреевич;Руководитель;34636474575468500;456457567;petro@mail.ru
TABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL
534636;4363467347;M;Васильев;Игорь;Петрович;Менеджер;457677567658;456457567;vasya@mail.ru

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от михалыч (ok) on 11-Май-14, 11:35 
#!/usr/bin/perl

$text = shift @ARGV;
$i = -1;

open FH, $text or die "can't open $text: $!\n";
while (<FH>) {
    chomp;
    next if /\^$/;
    $i++ if /TABEL_ID/;
    split ";";
    push @{$arr[$i]}, $_[1];
}
close FH;

for (@arr) {
    print "TABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL\n";
    print join (";", @{$_}), "\n";
}


Запускать так: ./script.pl /path/to/text.file
на awk мастер меча (читай Andrey Mitrofanov) могёт.. или может ))
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от тень_pavel_simple on 11-Май-14, 12:03 
>[оверквотинг удален]
>     split ";";
>     push @{$arr[$i]}, $_[1];
> }
> close FH;
> for (@arr) {
>     print "TABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL\n";
>     print join (";", @{$_}), "\n";
> }
> Запускать так: ./script.pl /path/to/text.file
> на awk мастер меча (читай Andrey Mitrofanov) могёт.. или может ))

http://www.gnu.org/software/gawk/manual/html_node/Multiple-L...

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от михалыч (ok) on 11-Май-14, 20:29 
cat text | grep -v '\^' | awk -F ";" '{ORS=";"} /EMAIL/ {ORS="\nTABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL\n"} {print $2}' | awk 'BEGIN {FS="\n"; RS=""; OFS=""} {for (i=NF; i>0; i--) print $i;}'

последовательность строк с данными будет с конца, но если не принципиально, то как вариант


Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

7. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от Andrey Mitrofanov on 25-Май-14, 12:18 
Не ждали? :*D

> cat text | grep -v '\^' | awk -F ";" '{ORS=";"} /EMAIL/

Эх, молодёж-ж-жь!
Тема gawk/Multiple-Line.html не раскрыта.

$ <text gawk -F'\n' -v RS=^ '{a=b="";for(i=1;i<=NF;i++){if(split($i,aa,";")>1){a=(a?a";":"")""aa[1];b=(b?b";":"")""aa[2]}}if(a""b){print a;print b}}'
TABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL
25235;3456436;M;Петров;Василий;Андреевич;Руководитель;34636474575468586;+456457567;petro@mail.ru
TABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL
534636;4363467347;M;Васильев;Игорь;Петрович;Менеджер;457677567658;+456457567;vasya@mail.ru
$ _

Ответить | Правка | ^ к родителю #3 | Наверх | Cообщить модератору

9. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от михалыч (ok) on 27-Май-14, 05:36 
ахренеть, шикарно.. ))
а я сразу сказал - надо звать мастера, он сделает красиво
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

11. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от Andrey Mitrofanov on 27-Май-14, 11:32 
> а я сразу сказал - надо звать мастера, он сделает красиво

После 25 строк #!/usr/bin/perl -- это не сразу. Честно, только сейчас схидил и прочитал.

Впрочем, эти самые 25 строк, ставшие ниже 15-ью, "позвали в дорогу" :D не хуже.

Ответить | Правка | ^ к родителю #9 | Наверх | Cообщить модератору

10. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от михалыч (ok) on 27-Май-14, 07:33 
а подмету-ка я, пожалуй, мусор, в своём перловом скрипте, а то как-то неприлично даже ))
#!/usr/bin/perl

$text = shift @ARGV;

open FH, $text or die "can't open $text: $!\n";
while (<FH>) {
    chomp;
    if (/\^$/) {$i++; next;}
    split ";";
    push @{$name[$i]}, $_[0];
    push @{$data[$i]}, $_[1];
}
close FH;

for ($j=0; $j<@name; $j++) {
    print join (";", @{$name[$j]}), "\n";
    print join (";", @{$data[$j]}), "\n";
}


это, конечно, не так изящно, но лучше, чем было )
Ответить | Правка | ^ к родителю #7 | Наверх | Cообщить модератору

4. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от Андрей (??) on 11-Май-14, 21:11 
Спасибо большое за помощь.
Попробую разобраться в предложенных скриптах. Опыта пока мало, надеюсь, осилю.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

5. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от михалыч (ok) on 12-Май-14, 03:58 
> Спасибо большое за помощь.
> Попробую разобраться в предложенных скриптах. Опыта пока мало, надеюсь, осилю.

вот так будет правильнее, меняет чёт/нечёт местами

cat text | grep -v '\^' | awk -F ";" '{ORS=";"} /EMAIL/ {ORS="\nTABEL_ID;CUSTOM_ID;PERSSEX;LASTNAME;FIRSTNAME;MIDDLENAME;TITLE;CONTACT_UNID;PHONE_MOBILE;EMAIL\n"} {print $2}' | awk 'NR%2==0 {print $0; print p} {p=$0}'

в предыдущем варианте был просто реверси строк

если хочешь что-то сделать - сделай это сам,
если хочешь что-то сделать хорошо - сделай это сам хорошо ))

Ответить | Правка | ^ к родителю #4 | Наверх | Cообщить модератору

6. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от pavlinux (ok) on 24-Май-14, 19:25 
> Здравствуйте.
> Подскажите.

# apt-get install sc
# psc -r < TEXT.txt | sc -W% -

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

8. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от Andrey Mitrofanov on 26-Май-14, 12:33 
> # apt-get install sc

Таблицы?? http://thelinuxrain.com/articles/a-pivot-table-in-awk Кто %) сказал "Таблицы"??!

Ответить | Правка | ^ к родителю #6 | Наверх | Cообщить модератору

12. "Транспонирование текста с учетом разделителя (sed, awk, ..)"  +/
Сообщение от pavlinux (ok) on 27-Май-14, 19:40 
>> # apt-get install sc
> Таблицы??

Можна массивы, с выборкой по модулю  


Ответить | Правка | ^ к родителю #8 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру