Здравствуйте.
Подскажите.Например, есть текст примерно такого содержания:
------------------------
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
#!/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) могёт.. или может ))
>[оверквотинг удален]
> 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";
> }
http://www.gnu.org/software/gawk/manual/html_node/Multiple-L...
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;}'последовательность строк с данными будет с конца, но если не принципиально, то как вариант
Не ждали? :*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
$ _
ахренеть, шикарно.. ))
а я сразу сказал - надо звать мастера, он сделает красиво
> а я сразу сказал - надо звать мастера, он сделает красивоПосле 25 строк #!/usr/bin/perl -- это не сразу. Честно, только сейчас схидил и прочитал.
Впрочем, эти самые 25 строк, ставшие ниже 15-ью, "позвали в дорогу" :D не хуже.
а подмету-ка я, пожалуй, мусор, в своём перловом скрипте, а то как-то неприлично даже ))#!/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";
}
это, конечно, не так изящно, но лучше, чем было )
Спасибо большое за помощь.
Попробую разобраться в предложенных скриптах. Опыта пока мало, надеюсь, осилю.
> Спасибо большое за помощь.
> Попробую разобраться в предложенных скриптах. Опыта пока мало, надеюсь, осилю.вот так будет правильнее, меняет чёт/нечёт местами
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}'
в предыдущем варианте был просто реверси строк
если хочешь что-то сделать - сделай это сам,
если хочешь что-то сделать хорошо - сделай это сам хорошо ))
> Здравствуйте.
> Подскажите.# apt-get install sc
# psc -r < TEXT.txt | sc -W% -
> # apt-get install scТаблицы?? http://thelinuxrain.com/articles/a-pivot-table-in-awk Кто %) сказал "Таблицы"??!
>> # apt-get install sc
> Таблицы??Можна массивы, с выборкой по модулю