Использование sed / awk для добавления одной строки в другую - PullRequest
0 голосов
/ 04 июля 2018

Чтобы упростить то, что я хочу, у меня есть это:

Group name="Group1"
Device name="G1_Device1" host="G1_host1"
Device name="G2_Device2" host="G1_host2"
Group name="Group2"
Device name="G2_Device1" host="G2_host1"
Group name="Group3"
Device name="G3_Device1" host="G3_Host1"
Device name="G3_Device2" host="G3_host2"
Device name="G3_Device3" host="G3_host3"
Device name="G3_Device4" host="G3_host4"

И мне это нужно (проверьте название группы):

Group name="Group1" Device name="G1_Device1" host="G1_host1"
Group name="Group1" Device name="G2_Device2" host="G1_host2"
Group name="Group2" Device name="G2_Device1" host="G2_host1"
Group name="Group3" Device name="G3_Device1" host="G3_Host1"
Group name="Group3" Device name="G3_Device2" host="G3_host2"
Group name="Group3" Device name="G3_Device3" host="G3_host3"
Group name="Group3" Device name="G3_Device4" host="G3_host4"

Есть ли способ сделать это с помощью sed и / или awk?

Ответы [ 3 ]

0 голосов
/ 04 июля 2018

Строго учитывая, что ваш фактический Input_file такой же, как показанные примеры, тогда вам могут помочь следующие.

awk '/^Group name/{value=$0;next} {print value,$0}' Input_file

Так что здесь я не делаю проверку, имеет ли строка строку device или нет, если ваш Input_file может иметь много других строк после Group, тогда нам, возможно, придется поставить проверку, как это делает решение @ Cyrus.

0 голосов
/ 04 июля 2018

С седом:

sed -E '/^Group/{h;d};G;s/(.*)\n(.*)/\2 \1/' infile

Разъяснения:

/^Group/ {              # If the line starts with "Group"...
    h                   # copy pattern space to hold space
    d                   # Delete pattern space, start new cycle
}
G                       # Append hold space to pattern space (inserts newline)
s/(.*)\n(.*)/\2 \1/     # Swap two lines in pattern space

Опция -E (-r для некоторых старых версий) - просто удобство; в противном случае группам захвата нужно бежать, как в \(.*\).

0 голосов
/ 04 июля 2018
awk '$1=="Group"{save=$0}; $1=="Device"{print save,$0}' file

Выход:

Group name="Group1" Device name="G1_Device1" host="G1_host1"
Group name="Group1" Device name="G2_Device2" host="G1_host2"
Group name="Group2" Device name="G2_Device1" host="G2_host1"
Group name="Group3" Device name="G3_Device1" host="G3_Host1"
Group name="Group3" Device name="G3_Device2" host="G3_host2"
Group name="Group3" Device name="G3_Device3" host="G3_host3"
Group name="Group3" Device name="G3_Device4" host="G3_host4"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...