Compare dois arquivos de saída sql que possuem nomes de coluna e imprima a diferença em outro arquivo

3

Eu sou novo no script Unix Shell. Eu preciso escrever um script de shell para comparar arquivos de saída de 2 sql (basicamente no formato .txt) que são as saídas da mesma consulta sql (antes e depois de uma tarefa de manutenção como clonagem) e imprimir as diferenças em outro arquivo de texto. p>

Arquivo de saída 1 (antes do clone):

NAME      OPEN_MODE 
--------- ----------
PROD123   READ WRITE

Arquivo de saída 2 (após o clone):

NAME      OPEN_MODE 
--------- ----------
DEV123    READ WRITE

Precisamos comparar os dois arquivos de saída acima e imprimir a diferença em outro arquivo de texto com base nas diferenças. Por exemplo:

Aqui na saída acima, o valor da coluna "NAME" não corresponde. Então a diferença deve ser impressa em outro arquivo como:

NAME não está correspondendo. OPEN_MODE está correspondendo. Por favor, verifique.

E o arquivo de saída terá várias saídas desse tipo. Portanto, também precisamos verificar todas essas saídas e fazer o spool da diferença para outro arquivo. Qualquer script de shell de amostra para obter o mesmo seria útil.

Atenciosamente, AR

    
por user206245 19.12.2016 / 14:43

2 respostas

2

Esta é uma solução usando o Awk:

#!/usr/bin/awk -f

NR == 1 {
    # Get the headers on the first line.
    # Will be done for both files, but we don't mind.
    head[1] = $1;
    head[2] = $2;
}

NR == 3 {
    # For the third line, go though the data in both columns...
    for (i = 1; i <= 2; ++i) {
        # If there's something in col[], then this is the second file.
        if (col[i]) {
            # This is the second file.
            # Test the value of the column against what was in the first file.
            if (col[i] == $i) {
                printf("%s is matching. ", head[i]);
            } else {
                printf("%s is not matching. ", head[i]);
                # Flag that we need to print extra info later.
                check = 1;
            }
        } else {
            # This is the first file.
            # Remember the data in the two columns.
            col[1] = $1;
            col[2] = $2;

            # Reset the record (line) counter.
            NR = 0;

            # Skip to the second file.
            nextfile;
        }
    }

    if (check) {
        printf("Please check.");
    }

    printf("\n");
}

Teste:

$ ./script.awk file1 file2
NAME is not matching. OPEN_MODE is matching. Please check.
    
por 19.01.2017 / 23:49
0

usando diff

diff file1 file2 > changes.log

    
por 19.12.2016 / 14:58