como imprimir apenas Diferença em dois arquivos usando NR = FNR?

0

temos que imprimir apenas as entradas antigas Delta (Diferença) no Arquivo-1 e no Arquivo-2. recém-adicionado entra em arquivos-1 sem necessidade de imprimir.

no meu servidor unix, todos os dias o novo relatório é extraído do sistema, mais tarde comparado com o relatório de ontem.

As linhas adicionadas recentemente no relatório do dia atual são impressas por lógica separada, o que funciona perfeitamente.

Agora, meu requisito é identificar os campos (por US $ 2, cheque modificado, US $ 4). Esses são atualizados no relatório de hoje, após a comparação com o relatório de ontem. Portanto, a lógica deve ser executada para verificar $ 2 linha por linha para descobrir $ 4 campos atualizados do Arquivo1 e imprimir o mesmo.

Eu tenho a lógica NR = FNR para fazer isso, mas não funciona para o caso abaixo

/usr/xpg4/bin/awk -F'!' 'NR==FNR{++a[$2,$4];next} !a[$2,$4]++ || NR==FNR{++a[$4];hold} a[$4]++' file-1 file-2

no entanto, esta nova lógica tem falhado na combinação de campos abaixo,

arquivo-novo

7! J9AA-50! LHR! 35!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! test3! test3! 8!
7! JWZZ-50! LHN! 15!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 21!

Arquivo antigo

7! J9AA-50! LHR! 34!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! test3! test3! 8!
7! JWZZ-50! LHN! 14!
7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 21!

com novo comando para comparar e imprimir. abaixo da lógica falham ao imprimir o resultado esperado,

/usr/xpg4/bin/awk -F'!' 'NR==FNR{++a[$2,$4];next} !a[$2,$4]++ || NR==FNR{++a[$4];hold} a[$4]++' File-New File-Old

este comando está imprimindo desnecessariamente as linhas 7! J9AA-50! LHR! 34! 8! J9BB-50! LHW! 22! & 7! test3! test3! 8!

Resultado atual,

7! J9AA-50! LHR! 34!
8! J9BB-50! LHW! 22!
7! test3! test3! 8!
7! JWZZ-50! LHN! 14! 
7! J9AA-50! LHR! 34!

Resultado esperado:

7! J9AA-50! LHR! 34!
7! JWZZ-50! LHN! 14!

temos que imprimir os campos atualizados de arquivos antigos (por US $ 2 cheque modificados em US $ 4), que são atualizados no novo relatório de hoje. so A lógica tem que se tornar $ 2 de File-Old em File-new se $ 2 estiver presente em File-New e então comparados os respectivos $ 4, se $ 4 for atualizado então imprima essa linha de File-Old.

alguém pode sugerir as alterações / lógica nova para obter a saída esperada. se não for possível usando NR = FNR, então como podemos obtê-lo usando o script shell / perl?

    
por Sachin Radkar 07.12.2016 / 09:01

1 resposta

0

Eu leria no Arquivo-2 e procuraria por linhas no Arquivo-1 que não estivessem na matriz. Tenha em mente que o awk usa a variável SUBSEP para unir strings em um índice de matriz:

awk -F'!' 'NR == FNR {f2[$2,$4]; next}  !($2 SUBSEP $4 in f2)' File-2 File-1

produz

7! J9AA-50! LHR! 35! 
7! test3! test3! 8 
7! test3! test3! 8 
7! JWZZ-50! LHN! 15! 
    
por 07.12.2016 / 17:22

Tags