Como ler linhas de um arquivo e combinar antes de uma correspondência de padrão de outro arquivo?

1

Esta assistência foi útil, mas ainda estou um pouco perdida. Eu vou roubar o formato super fácil. Como inserir o conteúdo de um arquivo em outro arquivo antes de um padrão (marcador)?

Eu tenho dois arquivos.

Arquivo 1

test
test2
test3
test4

Arquivo 2

Numebr of results: 0
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
Numebr of results: 0
Numebr of results: 0

Resultado final desejado (arquivo 3?)

test
Numebr of results: 0
test2
Numebr of results: 1

Object Name: 
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source 
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0

Olhando para ler uma linha de cada vez do arquivo1, encontre o próximo padrão para "Numebr de resultados", insira a linha1 do arquivo1 acima da primeira correspondência e itere sucessivamente o arquivo inteiro como tal.

Muito obrigado antecipadamente !!

    
por JJJ 20.01.2017 / 03:10

4 respostas

2

Sugiro usar o formulário Getline / Variable / File awk getline

$ awk '/^Numebr of results/ {if (getline line < "file1" > 0) print line} 1' file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
last_element: false
referral_info: source
referral_obj: Name: ommitted (Table: ommitted)
scheme_flags: 0
type: member
test3
Numebr of results: 0
test4
Numebr of results: 0
    
por 20.01.2017 / 03:27
1
$ awk 'NR==FNR{A[NR]=$0;next}{if($0~/^Numebr of results/){i++;print A[i]}}1' file1 file2
test
Numebr of results: 0
test2
Numebr of results: 1

Object Name:
Object UID: {A42CD268-ommitted}
Class Name: referral
    last_element: false
    referral_info: source
    referral_obj: Name: ommitted (Table: ommitted)
    scheme_flags: 0
    type: member
test3
Numebr of results: 0
test4
Numebr of results: 0
    
por 20.01.2017 / 06:36
1

Pode ser feito com sed , embora awk seja mais adequado:

echo "----" | cat file1 - file2 | sed -n '1, / ---- / {H; d}; / Numebr / {x; s / ^ \ n //; P; s / [^ \ n] * \ n //; x;}; p '

    
por 20.01.2017 / 09:15
0

Eu usei o subshell para gerenciar o descritor de arquivos simples. (não é necessário "exec 3 > & -")
descritor de arquivo herdado para o processo filho Se você usou um descritor de arquivo como este, então a posição do arquivo foi movida abaixo por todas as operações de leitura. Opção "e" executar patteren space string como um comando em sh

sh$ ( exec 3< file2; 

  sed -r '
    /^Number of results: [0-9]+/ {
    h
    s#.*#read line <\&3; echo -n "$line"#e
    G
    }
  ' file1; 
)
    
por 22.01.2017 / 17:18