URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 9859
[ Назад ]

Исходное сообщение
"Транспонирование текста с учетом разделителя (sed, awk, ..)"

Отправлено Андрей , 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


Содержание

Сообщения в этом обсуждении
"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Отправлено михалыч , 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) могёт.. или может ))

"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Отправлено тень_pavel_simple , 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...


"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Отправлено михалыч , 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;}'

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



"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Отправлено Andrey Mitrofanov , 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
$ _


"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Отправлено михалыч , 27-Май-14 05:36 
ахренеть, шикарно.. ))
а я сразу сказал - надо звать мастера, он сделает красиво

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

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

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


"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Отправлено михалыч , 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";
}


это, конечно, не так изящно, но лучше, чем было )

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

"Транспонирование текста с учетом разделителя (sed, awk, ..)"
Отправлено михалыч , 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}'

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

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


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

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


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

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


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

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