Substituir o campo em um arquivo com base na correspondência com um campo diferente em outro arquivo

4

aprecia qualquer ajuda com esta tarefa:

O arquivo A tem 4 campos e possui 90 mil linhas. O primeiro campo (coluna 1) tem um valor que precisa ser alterado se os critérios abaixo forem atendidos. O quarto campo (coluna 4) tem os dados referenciados no Arquivo B. Os dados no Arquivo A são registros DNS separados por tabulação:

Owner IN Type RData

FileA:

hostname1 IN A 10.10.20.1 
hostname2 IN A 10.10.20.2 
hostname3 IN A 10.10.20.3

FileB:

10.10.20.1 
10.10.20.2 
10.10.20.58 
10.10.21.245 
10.10.23.7

O arquivo B é uma coluna (um campo) e 1400 linhas. Os dados no Arquivo B são endereços IP.

Requisito: Para cada linha no Arquivo B, substitua o conteúdo do primeiro campo no Arquivo A se o quarto campo no Arquivo A corresponder.

Em inglês: Para cada IP listado no Arquivo B, substitua o valor do Proprietário no Arquivo A por um valor específico.

    
por Gordon 13.08.2015 / 06:56

2 respostas

3

( modificando da minha resposta aqui ... )

Você pode comparar NR com FNR para distinguir entre processar o primeiro ou os arquivos subseqüentes. Isso ocorre porque FNR é redefinido por arquivo, enquanto NR é a contagem em execução. Portanto, somente durante o processamento do primeiro arquivo a condição NR==FNR será satisfeita.

Para processar o FileB primeiro ...

awk 'NR==FNR{a[$1]=1}'

Definir o valor como "fictício" como 1 é bom o suficiente.

Depois, para processar o FileA ...

awk -F'\t' 'BEGIN{OFS=FS}NR!=FNR{if(a[$4]){$1="Reserved"};print}'

Aqui, o separador do campo de saída OFS é definido como FS para preservar a formatação quando awk reconstruir a linha completa ( $0 ).

Colocando os dois juntos:

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1}NR!=FNR{if(a[$4]){$1="Reserved"};print}' FileB FileA

Se você quer que ele seja um pouco mais terse ...

awk -F'\t' 'BEGIN{OFS=FS}NR==FNR{a[$1]=1;next}a[$4]{$1="Reserved"}1' FileB FileA

next é usado no processamento do arquivo primeiro para pular a impressão final indicada por (o final) 1 , que é um atalho de {print $0} . Com isso, podemos mudar a condição a[$4] (ou seja, true se existir em r ) 'out' para ser a condição para determinar se precisamos alterar $1 para "Reserved" ou não.

    
por 13.08.2015 / 12:17
1

Você pode fazer isso por meio de awk :

awk -F"\t" '{if(NF==1){arr[$1]=$1}else{if(arr[$4]==$4){$1="Reserved"}{print $0}}}' fileB, FileA

The constant variable NF indicates the number of fields in file, in this code the awk will read the FileB first, and put all its data in an array called arr, in FileA, if the fourth field $4 = the array value (IP Address), then it will replace the host name with reserved.

das suas amostras, isso produzirá:

Reserved IN A 10.10.20.1 
Reserved IN A 10.10.20.2 
hostname3 IN A 10.10.20.3
    
por 13.08.2015 / 07:40