Обработка текста - два текстовых файла: чтение строк блока из одного файла и добавление его после строки в другом текстовом файле - PullRequest
1 голос
/ 03 июля 2019

Мне нужно объединить два текстовых файла с фиксированным блоком строк в один.

Как я могу это сделать?

bridge-domain AAAA
mac
aging
time 3
!
limit
maximum 12
notification both
!
port-down flush disable
!
igmp snooping profile igmp-snoop  <--- 

после этой строки мне нужно добавить блок изстроки из другого текстового файла, например:

interface Bundle-Ether AAAAA
igmp snooping profile igmp-snoop
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
!

Так что в основном мне нужно читать каждые 6 строк из text2.txt и добавлять его каждые 12 строк в text1.txt

Desideredвывод:

bridge-domain AAAA
mac
aging
time 3
!
limit
maximum 12
notification both
!
port-down flush disable
!
igmp snooping profile igmp-snoop
interface Bundle-Ether AAAAA
igmp snooping profile igmp-snoop
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
!
bridge-domain BBBB
mac
aging
time 3
!
limit
maximum 12
notification both
!
port-down flush disable
!
igmp snooping profile igmp-snoop
interface Bundle-Ether BBBB
igmp snooping profile igmp-snoop
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
!

и т. д. ... до конца файла.

Ответы [ 4 ]

1 голос
/ 03 июля 2019
awk '
    NR==FNR {
        rec = rec $0 ORS
        if ( (FNR % 6) == 0 ) {
            recs[FNR/6] = rec
            rec = ""
        }
        next
    }
    { print }
    (FNR % 12) == 0 ) { printf "%s", recs[FNR/12] }
' file2 file1

или, если вы предпочитаете краткую и загадочную информацию (поскольку вы попросили решение sed для чего-то, что не просто s / old / new):

awk 'NR==FNR{r=r$0"\n";if(!FNR%6){s[++x]=r;r="";next}!(FNR%12){$0=$0 s[++y]}1' file2 file1

Вышеприведенное будет работать при использовании любого awk влюбая оболочка на каждой коробке UNIX.

1 голос
/ 03 июля 2019

Вот скрипт awk с более обширными тестовыми образцами.

input.1.txt

bridge-domain AAAA
mac
aging
time 3
!
limit
maximum 12
notification both
!
port-down flush disable
! -1
igmp snooping profile igmp-snoop  1
! 1.1
bridge-domain BBBB
mac
aging
time 3
!
limit
maximum 12
notification both
port-down flush disable
! -2
igmp snooping profile igmp-snoop 2
! 2.1
bridge-domain CCC
mac
aging
time 3
!
limit
maximum 12
notification both
port-down flush disable
! -3
igmp snooping profile igmp-snoop 3
! 3.1

input.2.txt

interface Bundle-Ether AAAAA
igmp snooping profile igmp-snoop
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
! AAAA section end
igmp snooping profile igmp-snoop
interface Bundle-Ether BBBB
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
! BBBB section end
igmp snooping profile igmp-snoop
interface Bundle-Ether CCCC
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
! CCCC section end

script.awk

FNR == NR {    # read insertion paragraph from file 1
    inpSectn = inpSectn $0; # accumlate input lines in inpSectn
    if (NR % 6 == 0) {  # if 6th line add section to array
        sectnArr[++arrCount] = inpSectn; # add inpSectn to ordered array
        inpSectn = "";  # reset inpSectn
    }
    next;      # skip further processing till all file 1 is consumed.
}
1              # output current input line.
FNR % 12 == 0 {   # every 12th line in file 2
    print sectnArr[++arrIdx]; # output section
}

работает:

awk -f script.awk input.2.txt input.1.txt

выход:

bridge-domain AAAA
mac
aging
time 3
!
limit
maximum 12
notification both
!
port-down flush disable
! -1
igmp snooping profile igmp-snoop  1
interface Bundle-Ether AAAAA
igmp snooping profile igmp-snoop
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
! AAAA section end
! 1.1
bridge-domain BBBB
mac
aging
time 3
!
limit
maximum 12
notification both
port-down flush disable
! -2
igmp snooping profile igmp-snoop 2
igmp snooping profile igmp-snoop
interface Bundle-Ether BBBB
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
! BBBB section end
! 2.1
bridge-domain CCC
mac
aging
time 3
!
limit
maximum 12
notification both
port-down flush disable
! -3
igmp snooping profile igmp-snoop 3
igmp snooping profile igmp-snoop
interface Bundle-Ether CCCC
dhcp ipv4 snoop profile
static-mac-address 0001
static-mac-address 0002
! CCCC section end
! 3.1
1 голос
/ 03 июля 2019

Это может сработать для вас (GNU sed):

sed -e '12~12{:a;R file2' -e 'x;s/^/x/;/x\{6\}/!{x;ba};z;x}' file1

Это считывает последовательно из файла2 для шести строк каждые 12 строк в файле1. Он использует счетчик в области удержания, который сбрасывается после шестой строки.

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

Спасибо всем!Множество способов сделать это, как я вижу.Я использовал сценарий awk, но методы Ed Morton и potong были в порядке!Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...