LINUX.ORG.RU

AWK, поиск строки в обратном направлении


0

0

Добрый день.

Есть некоторая задача, я пытаюсь решить ее с помощью awk. Интерес чисто практический, и инструмент не принципиален (awk,perl,sed,etc...).

Сама задача состоит в изменении строк в зависимости от данных некоторой предыдущей строки.

В тексте есть вхождения типа таких:

заголовок;sometext
;string1
;string2
;string3

Хочу из них сделать вот такое:

заголовок;sometext
заголовок;string1
заголовок;string2
заголовок;string3

Иными словами, найдя в начале строки точку с запятой, следует найти перед ней строку, не начинающуюся с точки с запятой, и взяв оттуда весь текст от начала строки до точки с запятой (включительно), вставить его в текущую строчку.

Сейчас я наваял вот такой скрипт:

awk '/^\;/ {
target=$0; 
split (header_line, header, ";"); 
sub(/\;/, "", target_line); 
result=header[1]";"target
print result};
{header_line=$0}'

Результат работы вот пока вот такой:

заголовок;string1
;string2
;string3

То есть обрабатывается только первая строка. Как сделать так, что бы скриптом обрабатывались все строки?

★★★★★

#!/bin/bash

caption=''

while read line
do
    if [ `expr match "$line" "^;.*$"` != 0 ] ; then
        echo $caption$line >>'output.txt'
    else
        if [ `expr length "$line"` != 0 ] ; then
            caption=$line;
        fi
        echo $line >> 'output.txt'
    fi
done < $1
vaulter ()
$ cat 1.txt
заголовок1;sometext 
;string1 
;string2 
;string3
заголовок2;sometext 
;string4 
;string5 
;string6

$ awk -F';' 'NF>1 && $1 != "" { p=$1 };
             {if ($1 == "") {
                   print p$0
              } else {
                   print $0}
             }' 1.txt

заголовок1;sometext 
заголовок1;string1 
заголовок1;string2 
заголовок1;string3
заголовок2;sometext 
заголовок2;string4 
заголовок2;string5 
заголовок2;string6
sdio ★★★★★ ()
Ответ на: комментарий от beastie

Спасибо!

Боже, как все просто!

Спасибо, ребята, вы мне здорово помогли!

Harliff ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.