padrões de correspondência atualizam o arquivo de saída descomente quando desejado

0

Precisa de sugestão para seguir. Tem dois arquivos myfile e responsefile.

Primeiro arquivo

myfile.txt  

user=myname   
user_1=yourname   
group=mygroup   
group_1=yourgroup

segundo arquivo

responsefile.txt

#Please fill details  
user=  
#user_1=  
#user_2=  

#Please fill details  
group=  
#group_1=  
#group_2=  

Baseado em myfile.txt data update responsefile.txt como abaixo e o arquivo responsefile.txt é de aproximadamente 604L, 16481C.

Resultado output

responsefile.txt

#Please fill details  
user=myname  
user_1=yourname  
#user_2=  

#Please fill details  
group=mygroup  
group_1=yourgroup  
#group_2=  

Se você observar myfile acima, quero corresponder user = no responsefile e, em seguida, atualizar como user = myname , o mesmo se aplica a group =. Em seguida, combine user_1 = e group_1 = que é hashed ou comentado em responsefile, atualize como user_1 = yourname e group_1 = yourgroup . Não deve remover hash ou descomentar para outros arquivos.

Eu tentei isso

awk -F= 'NR==FNR{a[$1]=$0;next}$1 in a{$0=a[$1]}1' myfile.txt responsefile.txt

Por favor, sugiro agradecer antecipadamente.

    
por user2692634 13.11.2013 / 14:15

1 resposta

0

Aqui está um script shell + sed que selecionará os nomes e valores das variáveis (na frente do loop) e os editará no arquivo (em várias passagens dentro do loop):

#!/bin/sh

sed -nr 's/^([^=#][^=]*)=(.*)$/\n/p' "$1" |
    while read var ; read val ; do
        sed -ri "s/^#?($var=) *$/$val/" "$2"
    done

O primeiro parâmetro do script é o arquivo com valores ( myfile.txt ). O segundo é o arquivo a ser preenchido ( responsefile.txt ). O segundo arquivo é editado no lugar. O script não trata o espaço em branco especialmente (exceto os espaços após = em responsefile.txt ), pois não ficou claro na questão como deveria ser.

Aqui está a extensão do seu script AWK concluído para ser funcional em todos os casos apresentados em seus arquivos de demonstração. Primeiro, ele preencherá o array associativo do primeiro arquivo, depois modificará o conteúdo do segundo arquivo e o enviará para stdout . Eu não estou apresentando isso como um verso para mantê-lo legível:

#!/usr/bin/awk -f

BEGIN   { FS="=" }
NR==FNR { a[$1]=$0; next }
$1 in a { $0=a[$1] }
/^#/    { var=$1; sub(/^#/, "", var); if(var in a) { $0=a[var] } }
1

Seu script só precisava de um tratamento especial para tarefas comentadas. Os parâmetros do script são os mesmos do primeiro script, mas a saída é enviada para stdout e o segundo arquivo não é modificado.

    
por 13.11.2013 / 16:10

Tags