Como extrair linhas do arquivo de origem com o arquivo de referência, adicionar ao arquivo de resultado? [duplicado]

1

Eu tenho uma pergunta e não consigo descobrir. É o Solaris. a fonte simplificada & arquivos de referência.

arquivo de origem s.txt:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user1,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user10,cn=users,dc=domain

arquivo de referência r.txt:

uniquemember: cn=user9,cn=users,dc=domain 
uniquemember: cn=user8,cn=users,dc=domain

Eu quero um script para usar o arquivo unembreember de registro de referência para extrair a linha cn = user9 do arquivo de origem e as 3 linhas acima, adicionar a um arquivo de resultado usermember _

add.ldif:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain
    
por SeanB 01.09.2018 / 01:17

2 respostas

2

Se você estiver tentando usar os valores em r.txt como chaves para extrair registros de várias linhas correspondentes de s.txt , tente

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= s.txt
  • process r.txt com o separador de registro padrão (nova linha), construindo a matriz associativa u com chaves do segundo campo separado por espaço em branco; então
  • desmarque o separador de registro RS= para alternar para modo de parágrafo para o segundo arquivo
  • processar s.txt no modo de parágrafo, ou seja, tratando cada bloco separado de linha em branco como um único registro, cujo último valor de campo $NF pode então ser usado como um valor de pesquisa em u
  • se $NF existir em u , imprima o registro inteiro

Para adicionar espaço entre os registros correspondentes:

Se você tiver o GNU awk ( gawk ), pode usar a variável especial RT para adicionar os separadores de parágrafo originais:

gawk 'NR==FNR {u[$2]++; next} $NF in u {print $0 RT}' r.txt RS= s.txt

Mais geralmente, você pode acrescentar uma nova linha adicional após cada registro correspondente:

awk 'NR==FNR {u[$2]++; next} $NF in u {print $0 "\n"}' r.txt RS= s.txt

ou adicione uma nova linha extra ao separador de campos saída padrão:

awk 'NR==FNR {u[$2]++; next} $NF in u' r.txt RS= ORS='\n\n' s.txt
    
por 01.09.2018 / 01:57
0

Entendi que você gostaria de usar um código para ler a palavra-chave user em r.txt e, em seguida, pesquisar essa palavra-chave em s.txt . Por fim, imprima a linha relevante para essa palavra-chave (e as três linhas anteriores) in s.txt . Você pode escrever essas linhas em um arquivo chamado "code" :

#!/bin/bash
if  [[ 'egrep user9 r.txt' ]] ; then 
grep -B 3 user9 s.txt
fi

Conceda este arquivo "code" permissions e execute-o no terminal da seguinte forma:

code > add.ldif

A saída é:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

Digamos que você tenha duas entradas para user9 em s.txt da seguinte maneira:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user1,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user18,cn=users,dc=domain

dn: cn=XXX,cn=XXX,dc=XXX 
changetype: XXX 
add: XXX 
uniquemember: cn=user9,cn=users,dc=domain

O código anterior encontraria duas entradas para user9:

dn: cn=task,cn=Groups,dc=domain 
changetype: modify 
add: uniquemember 
uniquemember: cn=user9,cn=users,dc=domain
--
dn: cn=XXX,cn=XXX,dc=XXX 
changetype: XXX 
add: XXX 
uniquemember: cn=user9,cn=users,dc=domain
    
por 01.09.2018 / 02:12