como adicionar uma linha após a ocorrência nth de uma palavra-chave do arquivo 1 para o arquivo 2

1
# Nexae Linux servers
##
subparent Nexas Nexae_NIX Linux
title Nexae Linux servers

group-eorted NFe zluetere
10.48.37.67 zintxzpanae01       # teetip NOzOLUMNe:info,trende
10.59.31.67 etrtxzpanae01       # teetip NOzOLUMNe:info,trende

group-sorted ZBTS

10.48.37.11 zinpl001z3a01       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.12 zinpl001z3a02       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.13 zinpl001z3a03       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.14 zinpl001z3a04       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.41 zinpl001z3b01       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.42 zinpl001z3b02       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.31 zinvl201a3001       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.32 zinvl201a3002       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.33 zinvl201a3003       #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.150 zinvl201a3004      #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.151 zinvl201a3005      #"TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.152    zinvl201a3006   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.20 zinvl201a3007       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.39 zinvl201a3008       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.65 zinvl201a3009       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.66 zinvl201a3010       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.70 zinvl201a3011       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.158    zinvl201a3012   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.48.37.34     zinvl201a3013   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.12 etrpl001z1a02       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.13 etrpl001z1a03       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.14 etrpl001z1a04       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.31 etrvl201a1001       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.32 etrvl201a1002       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.33 etrvl201a1003       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.150    etrvl201a1004   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.151    etrvl201a1005   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.152    etrvl201a1006   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.44 etrvl201a1008       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.47 etrvl201a1009       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.39 etrvl201a1010       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.65 etrvl201a1011       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.66 etrvl201a1012       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
10.59.31.70 etrvl201a1013       # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"
170.252.208.216 etrvl201a1007   # "TRENDe:*,netetat:netetat|netetat1|netetat2|netetat3"

#######################################################
##

Acima está o exemplo do arquivo HO . Estou usando o código sed abaixo para corresponder à palavra-chave group-sorted NTTA no arquivo ho e insira todas as entradas do arquivo t4 em ho .

sed -i.bak '/^group-sorted NTTA$/!b;N;N;r t4' ho

Mas a palavra-chave group-sorted NTTA aparece no arquivo 15 vezes, portanto, se eu quiser inserir as entradas depois da palavra-chave do meio. Posso fazer isso com sed ?

    
por Varun Dogra 08.01.2018 / 08:54

2 respostas

0

Para inserir o conteúdo do arquivo t4 duas linhas depois da n -th ocorrência de ^group-sorted NTTA$ no arquivo H0, tente:

awk -v n=2 'FNR==NR{t=t"\n"$0;next} /^group-sorted NTTA$/ && n==++cnt {x=NR+3} NR==x{print substr(t,2)} 1' t4 H0

Embora haja, sem dúvida, uma solução sed para esse problema, awk é uma opção mais natural aqui porque awk entende aritmética. Isso, por exemplo, torna mais fácil programar awk para fazer algo depois da n -th ocorrência de algo em que n é uma variável.

Como funciona

  • -v n=2

    Isso define o valor de n .

  • FNR==NR{t=t"\n"$0;next}

    Ao ler o arquivo com o primeiro nome, t4 , isso salva seu conteúdo na variável t .

  • /^group-sorted NTTA$/ && n==++cnt {x=NR+3}

    Ao ler o arquivo de segundo nome, H0 , o número de ocorrências de ^group-sorted NTTA$ é salvo na variável cnt . Se cnt for igual a n , então, atribuiremos a variável x ao valor do número da linha atual, NR , mais 3.

  • NR==x{print substr(t,2)}

    Quando alcançamos o número de linha x , imprimimos o conteúdo da variável t . (O comando substr remove um caractere de nova linha inicial supérfluo).

  • 1

    Esta é a abreviação do awk para imprimir a linha de corrente.

Exemplo

Considere estes arquivos de entrada:

$ cat H0
blah, blah
group-sorted ZBTS

10.48.37.11 zinpl001z3a01 #"TRENDe
10.48.37.12 zinpl001z3a02 #"TRENDe

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe
10.59.31.12 etrpl001z1a02       # "TRENDe
10.59.31.13 etrpl001z1a03       # "TRENDe

group-sorted NTTA

10.59.31.14 etrpl001z1a04       # "TRENDe
10.59.31.31 etrvl201a1001       # "TRENDe
10.59.31.32 etrvl201a1002       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe

E:

$ cat t4
line 1 of t4
line 2 of t4

A saída do nosso comando é:

$ awk -v n=2 'FNR==NR{t=t"\n"$0;next} /^group-sorted NTTA$/ && n==++cnt {x=NR+3} NR==x{print substr(t,2)} 1' t4 H0
blah, blah
group-sorted ZBTS

10.48.37.11 zinpl001z3a01 #"TRENDe
10.48.37.12 zinpl001z3a02 #"TRENDe

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe
10.59.31.12 etrpl001z1a02       # "TRENDe
10.59.31.13 etrpl001z1a03       # "TRENDe

group-sorted NTTA

10.59.31.14 etrpl001z1a04       # "TRENDe
line 1 of t4
line 2 of t4
10.59.31.31 etrvl201a1001       # "TRENDe
10.59.31.32 etrvl201a1002       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe
    
por 08.01.2018 / 09:57
0

Arquivo de entrada1

cat H0

blah, blah
group-sorted ZBTS

10.48.37.11 zinpl001z3a01 #"TRENDe
10.48.37.12 zinpl001z3a02 #"TRENDe

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe
10.59.31.12 etrpl001z1a02       # "TRENDe
10.59.31.13 etrpl001z1a03       # "TRENDe

group-sorted NTTA

10.59.31.14 etrpl001z1a04       # "TRENDe
10.59.31.31 etrvl201a1001       # "TRENDe
10.59.31.32 etrvl201a1002       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe

Arquivo de entrada2

cat t4

10
20

Comando

 c='sed -n -e '/group-sorted NTTA/{=;p;}' H0| sed "N;s/\n/ /g" | awk '{print $1}' | sed -n ''$y'p' | awk '{print 2 + $1}'';sed ''$c'r t4' H0

Saída

blah, blah
group-sorted ZBTS

10.48.37.11 zinpl001z3a01 #"TRENDe
10.48.37.12 zinpl001z3a02 #"TRENDe

group-sorted NTTA

10.59.31.11 etrpl001z1a01       # "TRENDe
10.59.31.12 etrpl001z1a02       # "TRENDe
10.59.31.13 etrpl001z1a03       # "TRENDe

group-sorted NTTA

10.59.31.14 etrpl001z1a04       # "TRENDe
10
20
10.59.31.31 etrvl201a1001       # "TRENDe
10.59.31.32 etrvl201a1002       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe

group-sorted NTTA

10.59.31.33 etrvl201a1003       # "TRENDe
10.59.31.150    etrvl201a1004       # "TRENDe
10.59.31.151    etrvl201a1005       # "TRENDe
    
por 08.01.2018 / 11:03