LINUX.ORG.RU

Как в awk присвоить полю значение из предыдущей строки

 


0

1

Есть файл (разделитель полей - |, пробелы в пустые поля добавил для нагядности):

Значение 1 |             |              |
           | Значение 11 |              |
           |             | Значение 111 |
           |             | Значение 112 |
           |             | Значение 113 |
Значение 2 |             |              |
           | Значение 21 |              |
           |             | Значение 211 |
           |             | Значение 212 |
           |             | Значение 213 |
           | Значение 22 |              |
           |             | Значение 221 |
           |             | Значение 222 |
           |             | Значение 223 |

Для значений из третьего поля нужно заполнить поля 1 и 2 их вышестоящими значениями, т.е привести его к виду:

Значение 1 |             |              |
           | Значение 11 |              |
Значение 1 | Значение 11 | Значение 111 |
Значение 1 | Значение 11 | Значение 112 |
Значение 1 | Значение 11 | Значение 113 |
Значение 2 |             |              |
           | Значение 21 |              |
Значение 2 | Значение 21 | Значение 211 |
Значение 2 | Значение 21 | Значение 212 |
Значение 2 | Значение 21 | Значение 213 |
           | Значение 22 |              |
Значение 2 | Значение 22 | Значение 221 |
Значение 2 | Значение 22 | Значение 222 |
Значение 2 | Значение 22 | Значение 223 |

Пытаюсь использовать для этой цели awk, но никак не могу выстроить правильную конструкцию.

Прошу помочь.

+[~]$ cat tst
Значение 1|||
|Значение 11||
||Значение 111|
||Значение 112|
||Значение 113|
Значение 2|||
|Значение 21||
||Значение 211|
||Значение 212|
||Значение 213|
|Значение 22||
||Значение 221|
||Значение 222|
||Значение 223|
+[~]$ cat awk
{
    if ($3 != "") {
        if ($1 == "") { $1 = old1; }
        if ($2 == "") { $2 = old2; }
    }
    print $1 "|" $2 "|" $3 "|"
    old1 = $1 ? $1 : old1
    old2 = $2 ? $2 : old2
}
+[~]$ awk -F'|' -fawk tst
Значение 1|||
|Значение 11||
Значение 1|Значение 11|Значение 111|
Значение 1|Значение 11|Значение 112|
Значение 1|Значение 11|Значение 113|
Значение 2|||
|Значение 21||
Значение 2|Значение 21|Значение 211|
Значение 2|Значение 21|Значение 212|
Значение 2|Значение 21|Значение 213|
|Значение 22||
Значение 2|Значение 22|Значение 221|
Значение 2|Значение 22|Значение 222|
Значение 2|Значение 22|Значение 223|

Наверное, можно как-то красивее сделать, но так вроде работает.

xaizek ★★★★★
()
Ответ на: комментарий от xaizek

Огромное спасибо! Отлично работает.

Neuro75
() автор топика
Ответ на: комментарий от xaizek

old1 = $1 ? $1 : old1

Некузяво как-то присваивать old1=old1. Вот так, наверное, получше:

{
    if($1 != "") f1 = $1
    if($2 != "") f2 = $2
    if ($3 != "")
        print f1 "|" f2 "|" $3 "|"
    else
        print $1 "|" $2 "|" $3 "|"
}

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