Compare dois arquivos com base nos valores de sua última coluna

5

Eu tenho dois arquivos, cada um deles tem várias colunas e não é igual em número de linha, eu preciso ler a terceira coluna em ambos os arquivos e certifique-se de que são idênticos, então compare a quarta coluna em ambos os arquivos e obter o maior número e imprimir linha inteira em um terceiro arquivo. e para a linha que não foi encontrada no outro arquivo, use-a também como o maior número

Arquivo A

a b c 10
d e f 11
g h i 15
j k l 15
p l m 35

Flie B

d e f 15
j k l 20
w x z 40

Saída exigida

Arquivo C

a b c 10
d e f 15
g h i 15
j k l 20
p l m 35
w x z 40
    
por Ali 20.01.2017 / 11:16

3 respostas

0
$ cat fileA fileB | sort -k3,3 -k4,4nr | sort -k3,3 -u
a b c 10
d e f 15
g h i 15
j k l 20
p l m 35
w x z 40

Este é um pipeline com três partes:

  1. Concatenar fileA com fileB .
  2. Classifique o arquivo concatenado em ordem numérica decrescente com base na quarta coluna para cada valor exclusivo na terceira coluna. O resultado deste passo é

    a b c 10
    d e f 15
    d e f 11
    g h i 15
    j k l 20
    j k l 15
    p l m 35
    w x z 40
    
  3. Classifique novamente, mas remova as duplicatas e use apenas a terceira coluna como chave de classificação. Como isso deixará a linha com a primeira ocorrência encontrada da chave de ordenação, mas descartará as linhas com chaves de ordenação duplicadas (e com valores menores na quarta coluna, graças ao primeiro ordenamento), isso dará nos o resultado desejado.

Essa abordagem desconsidera completamente o conteúdo das duas primeiras colunas.

    
por 21.01.2017 / 13:44
1

Assim:

awk '$4>n[$3]{n[$3]=$4;l[$3]=$0}END{for(i in l)print l[i]}' file_a file_b > file_c

Explicação: se a 4ª coluna for maior do que o máximo lembrado para a mesma 3ª coluna (em n array), lembre-se da nova quarta coluna e da linha inteira (em l array) dessa terceira coluna. No final, imprima todas as linhas lembradas.

    
por 21.01.2017 / 13:29
0

Se o seu intérprete awk reside em / usr / bin /:

cat doit.awk

#!/usr/bin/awk

NF!=4 {

    print "Field number must be 4" > "/dev/stderr";
    exit 1;
}

FILENAME=="file_a" {

    i++;
    numval_a[i]=$4;
    letters_a[i]=$1FS$2FS$3;
}

FILENAME=="file_b" {

    k++;
    numval_b[k]=$4;
    letters_b[k]=$1FS$2FS$3;
}

END {

    for(j=1; j<=i; j++) {

        if(letters_a[j]!=letters_b[j]) {

            print "Line missmatch!" > "/dev/stderr";
            exit 2;
        }

        if(numval_a[j]>numval_b[j])
            max=numval_a[j];
        else
            max=numval_b[j];

        print letters_a[j], max;
    }
}

awk -f doit.awk file_a file_b

a b c 10
d e f 15
g h i 20
j k l 25
    
por 20.01.2017 / 13:15