- AWK SPLIT, allez, 14:09 , 04-Сен-09 (1)
- AWK SPLIT, SLario, 14:51 , 04-Сен-09 (2)
Уважаемый allez, дело в том, что мне надо заполучить эту информацию в массиве. Запланирована обработка XML, в структуру которого будет вставлено разобранное по шаблону имя файла. Идея такая - разобрать имя файла в массив FNPart, шаблон вида "ID_Action_DD_MM_YY.xml" в массив Tags, потом создать такую строку: <Tag[1]><FNPart[1]></Tag[1]> ... <Tag[n]><FNPart[n]></Tag[n]> и вставить её в очередной XML (там запись в одну строку, поэтому можно вставить сгенерённую строчку между первыми найденными ><)
- AWK SPLIT, Andrey Mitrofanov, 14:57 , 04-Сен-09 (3)
- AWK SPLIT, SLario, 15:06 , 04-Сен-09 (4)
>>Почему строка утраивается? > >Потому что FILENAME - не только имя файла, но и... "три! четыре!! >килограмма..." ...чтение его построчно. Утраивается -- потому, что три строки в >соотв.файлах. >Да, точно, в тех XML-файлах по три строки... В предыдущем ответе я описал задачу, которую надо решить, м.б., это можно сделать как-то проще?
- AWK SPLIT, Andrey Mitrofanov, 15:15 , 04-Сен-09 (5)
- AWK SPLIT, SLario, 15:19 , 04-Сен-09 (6)
Ух ты, шикарно! Тогда ещё вопрос: шаблон имени файла задаётся переменной скрипта $FileNameTemplate немного выше по тексту (не попало в мою копипасту). Массив должен быть сформирован из него. Можно ли запихнуть в AWK обработку переменной скрипта?Пока я догадался делать это вот так: FileNameTemplate="ID_Action_DD_MM_YY" for file in `cat /$FileListFN`; do XMLInsertion=`echo $FileNameTemplate | awk '{N=split($0,Tags,"_")}{split(FILENAME,FNParts,"_")}{for (i=1; i<=N; i++) {print <Tags[i]><FNParts[i]><\Tags[i]>}}' $file` echo $XMLInsertion done Но это падает с ошибкой синтаксиса.
- AWK SPLIT, Andrey Mitrofanov, 16:14 , 04-Сен-09 (7)
- AWK SPLIT, SLario, 10:12 , 07-Сен-09 (9)
Интересно, можно ли как-нибудь ограничить набор входных строк и обрабатывать, например, только первую строку? Таким образом я смог бы убить все повторы, т.к., будет обрабатываться ровно одна строка. Я написал такое условие на входе:for file in `cat /$FileListFN`; do echo `awk 'NR==1 {N=split(FILENAME,FNParts,"_")} {for (i=1; i<=N; i++) {print FNParts[i]} }' $file` echo $XMLInsertion done , но оно не привело ни к чему хорошему - просто в случае выполнения шаблона выводится первая строка файла и все повторы из моего самого первого вопроса...
- AWK SPLIT, SLario, 15:30 , 09-Сен-09 (12)
>Интересно, можно ли как-нибудь ограничить набор входных строк и обрабатывать, например, только >первую строку? Решено использованием оператора {exit}.
- AWK SPLIT, SLario, 12:21 , 07-Сен-09 (11)
Андрей, приветствую!А что означает awk 'BEGIN{сделать_из_строки_массив_tag("'"$FileNameTemplate"'"}? Мне не удалось заставить скрипт заработать...
- AWK SPLIT, mx3ix, 16:22 , 04-Сен-09 (8)
- AWK SPLIT, SLario, 12:11 , 07-Сен-09 (10)
Приветствую! Ниже распишу задачу более подробно. Надо слить несколько однотипных XML-файлов в один большой XML, не потеряв при этом информацию об исходных файлах. Сохранять информацию предлагается в дополнительных тегах, которые добавятся в основной текст. Исходные XML-файлы представляют собой длинные строки, т.е., в первой строке лежит заголовок XML, а в следующих - записи XML, по одной записи на строку. Идея такая - шаблон имени файла (из входного параметра) разобрать в один массив Tag, имя текущего файла разобрать в другой массив FNPart, потом склеить из них XML-подобную строку вида <Tag[1]><FNPart[1]></Tag[1]> ... <Tag[n]><FNPart[n]></Tag[n]>, после этого выкинуть из очередного файла строку №1 (с заголовком) и работать только с остальными, заменяя в них самое первое вхождение сочетания >< на ><Tag[1]><FNPart[1]></Tag[1]> ... <Tag[n]><FNPart[n]></Tag[n]><. Этим я добьюсь добавления в текуший файл XML информации о названии этого файла. А потом я возьму шаблон заголовка (заголовок XML + открывающий общий тег), прилью к нему полученные строки из разных файлов XML с внедрённой информацией и закрою файл шаблоном подвала XML (закрывающий общий тег). Таким образом получается, что надо два раза использовать split, затем выводить результат склеивания в переменную shell, затем sed будет менять (начиная со второй строки) первое вхождение >< и менять его на >переменная<. Пока я завис на этапе ввода в awk переменной скрипта, хранящей шаблон имени файла. Подключенная внешняя переменная не видится в программе awk:for file in `cat /$FileListFN`; do echo `awk '{print $FNT} {N=split($FNT,Tags,"_")} {for (i=1; i<=N; i++) {print Tags[i] " | "} } {exit} ' $file -v FNT=$FileNameTemplate` done {exit} нужен для того, чтобы обрабатывать всё только один раз. Этот скрипт почему-то ничего не выводит, ждёт ввода с клавиатуры...
- AWK SPLIT, SLario, 15:32 , 09-Сен-09 (13)
Выяснил, что внутри awk-скрипта не надо писать $ перед именем переменной. Задача успешно решена, всем участникам обсуждения большое спасибо!
|